确保始终连接线程

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