執行緒之間的異常傳播
在多執行緒應用程式中,處理工作執行緒中發生的異常而不導致整個應用程式崩潰非常重要。本文探討如何將例外從工作線程傳播到主線程,從而允許呼叫者優雅地處理它們。
異常傳播的挑戰
一種簡單的方法是捕獲工作線程中的異常並記錄其類型和訊息。但是,此方法僅限於一組特定的異常類型,並且在新增異常時需要手動修改程式碼。
使用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 是共享指針,因此確保至少有一個Exception_ptr 指向每個異常以防止過早釋放是至關重要的。
以上是C 中如何在執行緒之間傳播異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!