Некоторые проблемы, которые могут возникнуть при использовании 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