【问题标题】:Exception between threads. How many std::exception_ptr and synchronization I need?线程之间的异常。我需要多少 std::exception_ptr 和同步?
【发布时间】:2016-12-17 16:48:30
【问题描述】:

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

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

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

【问题讨论】:

  • 是的,你当然需要“t”。没有它你就不能输入“线程”这个词。
  • 是的,你需要正确的同步,虽然我喜欢 std::async/std:: 未来
  • 您在各个线程中都有各种异常,您想在另一个线程中处理所有异常?这如何有用/可维护/可行?
  • 通常你按值抛出异常并按引用捕获。不需要指针,无论是共享的还是其他的,也不需要同步,也不需要std::current_exception(它适用于真正例外情况)。
  • “我想集中错误处理”。目前还不清楚你的意思到底是什么。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2020-11-02
    • 2018-06-26
    相关资源
    最近更新 更多