Sobes.tech
Back to questions
Junior — Middle
86

Как организовать обмен информацией между потоками о возникшей исключительной ситуации?

Answer from AI

sobes.tech AI

Для обмена информацией между потоками о возникшей исключительной ситуации в C/C++ можно использовать несколько подходов:

  1. Общий флаг с синхронизацией: один поток устанавливает флаг (например, std::atomic<bool>), сигнализируя о проблеме, другой поток проверяет этот флаг.

  2. Использование условных переменных (std::condition_variable): поток, обнаруживший исключение, уведомляет другие потоки через условную переменную.

  3. Передача исключений через специальные структуры: например, можно сохранить объект исключения в общем месте и сигнализировать о его наличии.

  4. Использование 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;
}

Этот способ позволяет безопасно передавать исключения между потоками.