线程之间的异常传播
在多线程应用程序中,处理工作线程中发生的异常而不导致整个应用程序崩溃非常重要。本文探讨了如何将异常从工作线程传播到主线程,从而允许调用者优雅地处理它们。
异常传播的挑战
一种简单的方法是捕获工作线程中的异常并记录其类型和消息。但是,此方法仅限于一组特定的异常类型,并且在添加新异常时需要手动修改代码。
使用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中文网其他相关文章!