在C 中的執行緒之間傳播異常
當從主執行緒呼叫的函式產生多個執行緒時,就會出現在C 中的執行緒之間傳播異常的任務。用於 CPU 密集型工作的工作執行緒。挑戰在於處理工作執行緒上可能發生的異常並將其傳播回主執行緒以進行正確處理。
傳統方法
一種常見的方法是手動捕獲工作線程上的各種異常,記錄它們的詳細信息,然後在主線程上重新拋出它們。但是,此方法有一個限制,即它僅支援一組固定的異常類型。將來引入的任何新異常類型都需要手動修改程式碼。
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,如果存在異常,則重新拋出異常。
多個工作線程的注意事項
如果您有多個工作線程,您需要為每個線程維護單獨的exception_ptr 實例以捕獲任何潛在的異常。
其他注意事項
以上是如何使用“exception_ptr”在 C 執行緒之間傳播異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!