【问题标题】:C++ Exception not caught, program terminates with abort未捕获 C++ 异常,程序以中止终止
【发布时间】:2019-08-07 14:53:15
【问题描述】:

此程序在异常处理程序被捕获之前终止

void main(){
    try{

       work1();

       std::thread joinableThread(
           [](){
               work2();
           }
       );

       work3();

       throw std::runtime_error("catch me if you can");

       joinableThread.join();

    } catch(const std::runtime_error& ex){
       std::cout << "You did it!" << std::endl;
    }
}

我想处理异常处理程序,但程序在堆栈展开期间终止。如何确保在堆栈展开期间加入线程?

【问题讨论】:

  • 具有joins 线程的析构函数的虚拟对象?
  • try外面创建线程对象,在try里面初始化,在catch里面检查是不是joinable然后join呢?
  • 两个选项:a)在 try-block 之外创建你的线程(编辑:这是之前评论者的建议)b)而不是 std::thread 使用加入破坏的变体,例如这个 @ 987654323@

标签: c++ multithreading exception stack-unwinding


【解决方案1】:

我认为在堆栈展开期间加入线程是个坏主意。在将来发生不受控制的事件之前暂停析构函数会使应用程序很难推理。

我相信,这就是std::thread析构函数抛出而不是加入线程的原因之一。

现在,回答您的问题。

第一个解决方案非常简单 - 将 std::thread 包装在您自己的对象中,该对象调用 join 它是析构函数。我认为,由于上述原因,这不是很好的方法。

第二个选项是做另一个包装对象——一个在它的析构函数中分离线程的对象。我认为这更好,但是您显然遇到了一个线程问题,该线程现在无法加入并等待完成。

为了缓解这种情况,您可以通过您选择的任何机制来增加您的线程以表示它已完成,而不是等待该信号(从其他分离的线程发出信号)。但是,如果本地线程使用在堆栈展开期间将被破坏的对象,这仍然会引发问题。我认为这个问题没有好的解决方案。

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 2019-01-24
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多