1

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

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;
    }
}

我想处理异常处理程序,但程序在堆栈展开期间终止。我该怎么做才能确保在堆栈展开期间加入线程?

4

1 回答 1

1

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

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

现在,回答你的问题。

第一个解决方案是超级简单的——包装std::thread在你自己的对象中,称之为join析构函数。我认为,由于上述原因,这不是很好的方法。

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

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

于 2019-08-07T15:20:14.140 回答