Некоторые проблемы, которые могут возникнуть при использовании std::async в асинхронных задачах:
- Непредсказуемое поведение. habr.com Если вызывать std::async с параметрами по умолчанию, происходит запуск с комбинацией политик выполнения, что может привести к непредсказуемому поведению. habr.com
- Невозможность предсказать доступ к локальным переменным потока. habr.com
- Асинхронная задача может не запуститься. habr.com Это происходит из-за того, что вызовы методов get() и wait() могут не быть вызваны в течение выполнения программы. habr.com
- Циклы могут никогда не завершиться. habr.com Это возможно, если условие выхода ожидает готовности std::future объекта, а он может начать выполняться в отложенном состоянии. habr.com
- Запуск слишком большого количества потоков. stackoverflow.com Если не отслеживать, сколько потоков используется, это может привести к такому результату. stackoverflow.com
- Проблемы с инициализацией локальных переменных потока. ddanilov.me Например, в случае MSVC, так как вместо создания новых потоков используется повторно ресурс Windows ThreadPool, локальные переменные потока могут быть неправильно инициализированы. ddanilov.me
- Проблемы с портацией кода. ddanilov.me Различия в реализациях могут привести к неожиданному поведению после переноса кода между разными средами, например GCC/LLVM и MSVC. ddanilov.me
Чтобы избежать этих проблем, рекомендуется использовать std::async с политикой запуска std::launch::async. habr.com