スレッド間での例外の伝播
マルチスレッド アプリケーションでは、ワーカー スレッドからの例外を処理するのが困難な場合があります。未処理の例外によってアプリケーション全体がクラッシュすることを避け、メインスレッドがそれらの例外を適切に処理する方法を提供することが重要です。
例外伝播のテクニック
で提案されているアプローチ問題は、ワーカー スレッドで例外をキャッチし、そのタイプとメッセージを記録し、switch ステートメントを使用してメイン スレッドで例外を再スローすることです。効果的ではありますが、限られた例外タイプのサポートに制限があります。
より堅牢な解決策は、C 11 で導入された例外_ptr タイプを利用することです。Exception_ptr を使用すると、スレッド間で例外を転送できます。
Exception_ptr を使用した例 (C 11)
次のコードは、Exception_ptr を使用して複数のワーカー スレッドとメイン スレッド間で例外を伝播する方法を示しています。
<code class="cpp">#include <iostream> #include <thread> #include <exception> #include <stdexcept> std::exception_ptr* exceptions[MAX_THREADS]; // Array to store exceptions from worker threads void f(int id) { try { // Simulated work std::this_thread::sleep_for(std::chrono::seconds(1)); throw std::runtime_error("Exception in thread " + std::to_string(id)); } catch (...) { exceptions[id] = std::current_exception(); } } int main() { std::thread threads[MAX_THREADS]; // Start worker threads for (int i = 0; i < MAX_THREADS; i++) { threads[i] = std::thread(f, i); } // Wait for threads to finish for (int i = 0; i < MAX_THREADS; i++) { threads[i].join(); } // Check for and propagate exceptions for (int i = 0; i < MAX_THREADS; i++) { if (exceptions[i]) { try { std::rethrow_exception(*exceptions[i]); } catch (const std::exception& ex) { std::cerr << "Thread " << i << " exited with exception: " << ex.what() << "\n"; } } } return 0; }</code>
この例では、ワーカー スレッドごとに別個の例外_ptr が割り当てられ、複数の例外がスローされてメイン スレッドに伝播されることが可能になります。このアプローチは、マルチスレッド アプリケーションでの例外処理のための、より動的で柔軟なソリューションを提供します。
以上がマルチスレッド C アプリケーションのスレッド間で例外を効果的に伝播するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。