ホームページ  >  記事  >  バックエンド開発  >  C のスレッド間で例外を伝播するにはどうすればよいですか?

C のスレッド間で例外を伝播するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 04:14:02591ブラウズ

How Can Exceptions be Propagated Between Threads in C  ?

スレッド間の例外の伝播

マルチスレッド アプリケーションでは、アプリケーション全体をクラッシュさせることなくワーカー スレッドで発生する例外を処理することが重要です。この記事では、ワーカー スレッドからメイン スレッドに例外を伝播し、呼び出し元が例外を適切に処理できるようにする方法について説明します。

例外伝播の課題

素朴なアプローチの 1 つは、次のとおりです。ワーカー スレッドで例外をキャッチし、その種類とメッセージを記録します。ただし、このメソッドは特定の例外タイプのセットに限定されており、新しい例外を追加するときに手動でコードを変更する必要があります。

Exception_ptr を使用した例外の伝播

C 11 では、Exception_ptr が導入されています。これは、スレッド間で例外を保存および転送するための安全かつ柔軟な方法を提供します。このアプローチでは:

  1. 各ワーカー スレッドは例外をキャッチし、例外_ptr に保存します。
  2. メイン スレッドは、例外が発生したかどうかを確認するために、例外_ptrs をチェックします。
  3. 例外が見つかった場合、メインスレッドは例外を再スローし、呼び出し元が例外を処理できるようにします。

コード例

<code class="cpp">#include <iostream>
#include <thread>
#include <exception>
#include <stdexcept>

static std::exception_ptr myException;

void f() {
    try {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        throw std::runtime_error("To be passed between threads");
    } catch (...) {
        myException = std::current_exception();  // Store the exception
    }
}

int main() {
    std::thread myThread(f);
    myThread.join();

    if (myException) {
        try {
            std::rethrow_exception(myException);  // Rethrow the exception
        } catch (const std::exception& ex) {
            std::cerr << "Thread exited with exception: " << ex.what() << "\n";
        }
    }

    return 0;
}</code>

マルチスレッドに関する考慮事項

複数のワーカー スレッドを使用するシナリオでは、Exception_ptrs の配列を使用して各スレッドから例外をキャプチャする必要があります。さらに、Exception_ptr は共有ポインターであるため、時期尚早な割り当て解除を防ぐために、少なくとも 1 つのException_ptr が各例外を指すようにすることが重要です。

以上がC のスレッド間で例外を伝播するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。