確保始終連線執行緒

當呼叫了 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() 並且我們的程序將被終止。