Есть несколько способов:
std::async возвращает std::future. При попытке получить результат из future (например, с помощью future.get()) в главном потоке, если в асинхронной задаче произошло исключение, оно будет повторно брошено в главном потоке.std::promise с помощью promise.set_exception(). Другой поток может получить(promise.get_future()) соответствующий std::future и при вызове future.get() получить сохраненное исключение.try-catch блок. В случае исключения, сохранить указатель на него (с помощью std::current_exception()) или специальный флаг в разделяемой переменной, доступ к которой синхронизирован.boost::exception: boost::exception предоставляет более мощные механизмы для захвата, хранения и передачи исключений между потоками, позволяя прикреплять к исключению дополнительную информацию.Пример с std::async:
cpp
Пример с std::promise и std::future:
cpp
Выбор метода зависит от архитектуры приложения и требований к обработке ошибок. std::async и std::future являются наиболее простым способом для передачи результатов и исключений из одноразовых задач. std::promise и std::future предоставляют больше гибкости. Ручное сохранение статуса или исключения подходит для специфических сценариев с кастомной логикой синхронизации.