マルチスレッド アプリケーションでは、クラッシュやデータ破損を防ぐために例外を適切に処理することが不可欠です。一般的なシナリオの 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 &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 サイトの他の関連記事を参照してください。