#topicpath ////////////////////////////////////////////////////////////////////////////// * 目次 [#z44d9e2e] #contents(); ////////////////////////////////////////////////////////////////////////////// * 初めに [#s8cb5470] - C++11 では thread がサポートされている。→ std::thread class を使う ////////////////////////////////////////////////////////////////////////////// * thread の作成 [#v6807388] - 関数 foo(), bar() をそれぞれ別の thread で実行する // 排他出力処理 mutex print_mutex; void print( const string &s ) { lock_guard<mutex> lk(print_mutex); cout << s << endl; } void foo() { print( "foo" ); } void bar() { print( "bar" ); } // foo(), bar() をそれぞれ別の thread で実行 thread th1( foo ); thread th2( bar ); th1.join(); th2.join(); - 関数や関数オブジェクトの呼び出し演算子が仮引数を取る場合、 std::thread のコンストラクタの第2引数以降に関数や関数オブジェクトの関数呼び出し演算子へ与える実引数を渡す。 - std::thread のコンストラクタに渡された実引数は、受け取る関数が参照渡しとして宣言されていたとしても、コピーされて std::thread クラスのオブジェクト内に保存される。 -- 上記コピーを避けたい場合は、実引数をムーブするか、 std::ref() 関数でくるんで渡す。 -- std::ref() を使用した場合、作成した thread に参照が渡されるので、元のオブジェクトの寿命に注意すること。 - thread 内で例外が発生し、 catch されないまま thread 外に送出されると、std::terminate() が呼び出され、プログラムが強制終了する。 ////////////////////////////////////////////////////////////////////////////// * thread 終了を待機する [#c8cbe7dc] ////////////////////////////////////////////////////////////////////////////// * thread を手放す [#t3ea7895] ////////////////////////////////////////////////////////////////////////////// * thread の識別 [#x6a39824] ////////////////////////////////////////////////////////////////////////////// * 現在の thread の処理を明け渡す [#s20f6dff] ////////////////////////////////////////////////////////////////////////////// * 現在の thread をスリープする [#q1284bbf] ////////////////////////////////////////////////////////////////////////////// * 並行実行できる thread の数を取得する [#te2d6f95] ////////////////////////////////////////////////////////////////////////////// * thread を排他制御する [#d81456e1] ////////////////////////////////////////////////////////////////////////////// * リソースのロックを管理する [#o619d861] ////////////////////////////////////////////////////////////////////////////// * 複数のリソースをロックする [#w31f69a0] ////////////////////////////////////////////////////////////////////////////// * ロックせずに吐いたアクセスする [#p87c1c1a] ////////////////////////////////////////////////////////////////////////////// * スレッドセーフに1度だけ関数を呼び出す [#g8f42eac] ////////////////////////////////////////////////////////////////////////////// * 条件変数を使用する [#kb3e1964] ////////////////////////////////////////////////////////////////////////////// * thread をまたいで値や例外を受け渡す [#l67d5b92] ////////////////////////////////////////////////////////////////////////////// * 非同期処理をする [#kd28f4df] ////////////////////////////////////////////////////////////////////////////// * スレッドローカル変数を使用する [#k24f952f]