首页 >后端开发 >C++ >C 中如何在线程之间传播异常?

C 中如何在线程之间传播异常?

Linda Hamilton
Linda Hamilton原创
2024-10-31 04:14:02662浏览

How Can Exceptions be Propagated Between Threads in C  ?

线程之间的异常传播

在多线程应用程序中,处理工作线程中发生的异常而不导致整个应用程序崩溃非常重要。本文探讨了如何将异常从工作线程传播到主线程,从而允许调用者优雅地处理它们。

异常传播的挑战

一种简单的方法是捕获工作线程中的异常并记录其类型和消息。但是,此方法仅限于一组特定的异常类型,并且在添加新异常时需要手动修改代码。

使用Exception_ptr进行异常传播

C 11引入了exception_ptr类型,它提供了一种安全灵活的方式来在线程之间存储和传输异常。在这种方法中:

  1. 每个工作线程捕获异常并将其存储在Exception_ptr中。
  2. 主线程检查Exception_ptr以查看是否发生任何异常。
  3. 如果发现异常,主线程会重新抛出异常,允许调用者处理它。

代码示例

<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn