确保始终连接线程
当调用了 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()
并且我们的进程将被终止。