- thread[meta header]
- std[meta namespace]
- thread[meta class]
- function[meta id-type]
- cpp11[meta cpp]
void join();スレッドが終了するまで待機する
threadオブジェクトにスレッドが関連付けられていること(joinable() == true)。
thisに関連付けれられたスレッドが完了するまで、この関数を呼び出したスレッドをブロックする。
関連付けられたスレッドの完了は、join()メンバ関数の正常リターンと 同期する 。
つまり、「thisに関連付けられたスレッドT1上で行われる全処理の完了」は、
「join()メンバ関数を呼び出したスレッドT0上での同メンバ関数からの正常リターン」よりも 前に発生する 。
thisは何も指さない空のthreadオブジェクトとなる。
join操作に失敗した場合、system_error例外を投げる。
#include <cassert>
#include <thread>
int main()
{
int x = 0;
std::thread t([&]{ ++x; });
// ここでxにアクセスするとdata raceにより未定義動作
t.join();
// 別スレッド上で行われた全処理が完了している
assert(x == 1);
return 0;
}- join()[color ff0000]
- C++11
- Clang:
- GCC:
- GCC, C++11 mode: 4.6.3, 4.7.0
- ICC:
- Visual C++: 2012, 2013, 2015
- 2012現在はバグ有り std::thread::join() hangs if called after main() exits when using VS2012 RC
- main 関数を抜けた後に join() を呼ぶとハングアップするというもの
- 2012現在はバグ有り std::thread::join() hangs if called after main() exits when using VS2012 RC