最終更新:2021-01-05 (火) 04:55:47 (1201d)
C++11/マルチスレッド
クラス
C++標準ライブラリ提供クラスのデータ競合に関する基本ルール
- クラスオブジェクトのconstメンバ関数呼び出しは、オブジェクトに対する読み込み操作とみなす。
- クラスオブジェクトの非constメンバ関数呼び出しは、オブジェクトに対する変更操作とみなす。(一部例外事項あり)
- 追加的な例外事項として、begin, endやatなどの一部の非constメンバ関数ではオブジェクト自身の内部状態を変更しないため、これらもデータ競合に関してはconstメンバ関数相当(=読み込み操作)とみなします。
- 特殊化されたstd::vector<bool>だけは、異なる要素へのアクセスであってもデータ競合が発生する可能性があります
- C++標準ライブラリでは「異なるstd::shared_ptrオブジェクトに対するメンバ関数呼び出しは、その参照先に関わらずデータ競合を引き起こさない」と明確に保証しています
- 参照カウント更新はatomic変数操作(または排他制御あり変数更新)にて行われる
標準入出力
- 標準入出力ストリームオブジェクトに対する入力/出力操作は、排他制御を行わなくてもデータ競合を引き起こさない
スレッド/終了
- threadオブジェクトがjoinもdetachもせずにデストラクトされるとstd::terminateを呼び出して強制終了
参照を渡す
- DECAY_COPYによってエラーになるのでstd::refやstd::crefに包んで渡す