Как организовать обмен информацией между потоками о возникшей исключительной ситуации?
Ответ от нейросети
sobes.tech AI
Для обмена информацией между потоками о возникшей исключительной ситуации в C/C++ можно использовать несколько подходов:
-
Общий флаг с синхронизацией: один поток устанавливает флаг (например,
std::atomic<bool>), сигнализируя о проблеме, другой поток проверяет этот флаг. -
Использование условных переменных (
std::condition_variable): поток, обнаруживший исключение, уведомляет другие потоки через условную переменную. -
Передача исключений через специальные структуры: например, можно сохранить объект исключения в общем месте и сигнализировать о его наличии.
-
Использование
std::promiseиstd::future: поток, в котором произошло исключение, устанавливает исключение вstd::promise, а другой поток получает его черезstd::future.
Пример с std::promise:
#include <iostream>
#include <thread>
#include <future>
void worker(std::promise<void> prom) {
try {
// Некоторая работа, которая может выбросить исключение
throw std::runtime_error("Ошибка в потоке");
} catch (...) {
prom.set_exception(std::current_exception());
}
}
int main() {
std::promise<void> prom;
std::future<void> fut = prom.get_future();
std::thread t(worker, std::move(prom));
try {
fut.get(); // Здесь будет выброшено исключение из потока worker
} catch (const std::exception& e) {
std::cout << "Поймано исключение из потока: " << e.what() << std::endl;
}
t.join();
return 0;
}
Этот способ позволяет безопасно передавать исключения между потоками.