c++ - 线程之间的异常。我需要多少 std::exception_ptr 和同步?

标签 c++ multithreading c++11 exception

我有点困惑,但我的问题很简单。

我有一堆线程,我想通过在主线程中处理其他线程发送的所有异常来集中处理错误。

  1. 我是否在每个线程的每个 catch 子句中使用全局共享 exception_ptr 并使用 std::current_exception()?还是我需要为不同的线程设置不同的 excpetion_ptr 对象?我想保留所有异常(exception)情况。
  2. current_exception 分配给 exc_ptr 变量后,当我从主线程访问 exc_ptr 时,是否需要同步从主线程读取?

最佳答案

您只想将那些未被从属线程处理的异常传播到主线程。这意味着您只需要在从属线程的最顶层处理程序中使用 exception_ptr

我认为最简单的方法是拥有一个包含 exception_ptr 的全局容器(例如生产者/消费者队列)。每个顶级线程异常处理程序将其异常推送到队列并退出。主处理程序从队列中提取异常并重新抛出。当然,您需要对队列进行适当的同步。一旦您将 exceoption_ptr 从队列中拉出,您就不需要同步它,因为创建它的线程不会再接触它。

也应该可以有一个全局exception_ptr(相当于容量为 1 的队列,并以大致相同的方式同步)。

关于c++ - 线程之间的异常。我需要多少 std::exception_ptr 和同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38888020/

相关文章:

c++ - 成员(member)使用无效(您是否忘记了“&”?)

c++ - 正确推送结构的 2D vector 的问题 (C++)

php - 服务器发送的事件 PHP 阻塞流

c++ - GCC 4.8 中 C++11 thread_local 变量的性能损失是多少?

c++ - Json11源码的一些困惑

c++ - 创建共享 packaged_task 接受带转发的参数

c++ - 如何在 C++ 中打印二维数组?

java - 在从主线程发布的主线程上启动线程?

C++11 is_pod 与 GCC 4.6

c++ - 使用运行时参数桥接模板