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

时间:2016-08-11 05:37:51

标签: c++ multithreading c++11 exception

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

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

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

1 个答案:

答案 0 :(得分:2)

您希望仅将那些未由下级线程处理的异常传播到主线程。这意味着您只需要在下级线程的最高级别处理程序中使用exception_ptr

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

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