スレッド間の例外の伝播
マルチスレッド アプリケーションでは、アプリケーション全体をクラッシュさせることなくワーカー スレッドで発生する例外を処理することが重要です。この記事では、ワーカー スレッドからメイン スレッドに例外を伝播し、呼び出し元が例外を適切に処理できるようにする方法について説明します。
例外伝播の課題
素朴なアプローチの 1 つは、次のとおりです。ワーカー スレッドで例外をキャッチし、その種類とメッセージを記録します。ただし、このメソッドは特定の例外タイプのセットに限定されており、新しい例外を追加するときに手動でコードを変更する必要があります。
Exception_ptr を使用した例外の伝播
C 11 では、Exception_ptr が導入されています。これは、スレッド間で例外を保存および転送するための安全かつ柔軟な方法を提供します。このアプローチでは:
コード例
<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 サイトの他の関連記事を参照してください。