C のスレッド間で例外を伝播する
C のスレッド間で例外を伝播するタスクは、メイン スレッドから呼び出された関数が複数のスレッドを生成するときに発生します。 CPU を集中的に使用する作業のためのワーカー スレッド。課題は、ワーカー スレッドで発生する可能性のある例外を処理し、それらをメイン スレッドに伝播して適切に処理することにあります。
従来のアプローチ
一般的なアプローチの 1 つは次のとおりです。ワーカー スレッドでさまざまな例外を手動でキャッチし、その詳細を記録し、メイン スレッドで再スローします。ただし、このメソッドには、例外タイプの固定セットのみがサポートされるという制限があります。将来導入される新しい例外タイプでは、コードを手動で変更する必要があります。
C 11 例外処理
C 11 では、より堅牢なソリューションを提供するException_ptr タイプが導入されています。例外の伝播用。このタイプでは、スレッド間で例外を伝達できます。
実装例
次の例は、Exception_ptr を使用して例外を伝達する方法を示しています。
<code class="cpp">#include <iostream> #include <thread> #include <exception> #include <stdexcept> static std::exception_ptr eptr; void worker() { try { // Simulated CPU-intensive work with a delay std::this_thread::sleep_for(std::chrono::seconds(1)); throw std::runtime_error("Exception in worker thread"); } catch (...) { eptr = std::current_exception(); } } int main() { // Create a worker thread std::thread workerThread(worker); workerThread.join(); // Check if an exception occurred on the worker thread if (eptr) { try { // Rethrow the exception on the main thread std::rethrow_exception(eptr); } catch (const std::exception &ex) { // Handle the exception on the main thread std::cerr << "Worker thread exited with exception: " << ex.what() << "\n"; } } return 0; }</code>
この例では、ワーカー スレッドは発生した例外をキャッチし、それを eptr に割り当てます。メインスレッドでは、eptr がチェックされ、例外が存在する場合は再スローされます。
複数のワーカー スレッドに関する注意
複数のワーカー スレッドがある場合潜在的な例外をキャプチャするには、スレッドごとに別個の例外_ptr インスタンスを維持する必要があります。
追加の考慮事項
以上がC で「Exception_ptr」を使用してスレッド間で例外を伝播するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。