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

Exception between threads. How many std::exception_ptr and synchronization I need?

本文关键字:exception ptr 同步 std 异常 多少 线程      更新时间:2023-10-16

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

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

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

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

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

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