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

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-29 07:46:02804ブラウズ

How do I propagate exceptions between threads in C  ?

例外によるスレッド境界の越え

マルチスレッド アプリケーションでは、クラッシュやデータ破損を防ぐために例外を適切に処理することが不可欠です。一般的なシナリオの 1 つは、メイン スレッドがワーカー スレッドを生成して集中的なタスクを実行し、その結果を待つ場合です。このような場合、適切に処理するために、ワーカー スレッド内で発生した例外をメイン スレッドに伝播して戻す必要があります。

Exception_ptr を使用した例外の伝播

C 11 では、Exception_ptr 型が導入されました。これにより、スレッド間で例外を転送できるようになります。次の例を考えてみましょう。

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

static std::exception_ptr teptr = nullptr;

void f()
{
    try
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        throw std::runtime_error("To be passed between threads");
    }
    catch(...)
    {
        teptr = std::current_exception();
    }
}</code>

f() 関数は例外をキャッチし、std::current_Exception() を使用して teptr でキャプチャします。

メイン スレッドでの例外の取得

メインスレッドはワーカースレッドから例外を取得します。

<code class="cpp">std::thread mythread(f);
mythread.join();

if (teptr) {
    try{
        std::rethrow_exception(teptr);
    }
    catch(const std::exception &amp;ex)
    {
        std::cerr << "Thread exited with exception: " << ex.what() << "\n";
    }
}</code>

例外がキャプチャされた場合 (teptr が null でない場合)、std::rethrow_Exception() は

複数のワーカー スレッドの処理

複数のワーカー スレッドを使用するシナリオでは、各スレッドに例外_ptr を設定できます。例外を捕捉するため。さらに、Exception_ptr は共有ポインタであることに注意してください。したがって、時期尚早な削除を防ぐために、少なくとも 1 つのポインターが常に例外を指す必要があります。

Microsoft 固有の例外に関する注意

構造化例外処理 (SEH) 例外を使用する場合例のコードでは SEH 例外も転送されますが、これは望ましくない可能性があります。

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

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