確保始終連線執行緒
當呼叫了 std::thread
解構函式,要麼 join()
或 detach()
呼叫必須已經作出。如果一個執行緒沒有被連線或分離,那麼預設情況下會呼叫 std::terminate
。使用 RAII ,這通常很簡單,可以實現:
class thread_joiner
{
public:
thread_joiner(std::thread t)
: t_(std::move(t))
{ }
~thread_joiner()
{
if(t_.joinable()) {
t_.join();
}
}
private:
std::thread t_;
}
然後使用它:
void perform_work()
{
// Perform some work
}
void t()
{
thread_joiner j{std::thread(perform_work)};
// Do some other calculations while thread is running
} // Thread is automatically joined here
這也提供了異常安全性; 如果我們正常建立我們的執行緒並且在執行其他計算的 t()
中完成的工作丟擲了異常,那麼我的執行緒上永遠不會呼叫 join()
並且我們的程序將被終止。