是否有任何方法来防止程序终止,如果一个异常被抛出之前,一个子线程已经加入?


//...
try
{
std::thread someThread(someFunc, someArg); // assume it doesn't throw
foo(); // might throw
bar(); // might throw
someThread.join();
}
//...

在上面的例子中,如果foo()bar()抛出,someThread的析构函数将调用terminate()函数,因为someThread由于堆栈展开而没有加入父线程,这将导致整个程序终止。是否有任何方法可以防止这种行为并在不终止程序的情况下处理异常?

一种选择是在try/catch块之前简单地声明someThread,并在try子句中使用move-assignment。然后调用join,然后可以立即在catch子句之后…

std::thread someThread;
try
{
someThread = std::thread(someFunc, someArg);
foo(); // might throw
bar(); // might throw
}
catch (...) {
/*
* Do some error handling...
*/
}
if (someThread.joinable())
someThread.join();

或者,如果你的编译器支持c++20,你可能想看看std::jthread

相关内容

  • 没有找到相关文章

最新更新