//...
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
。