最終更新:2021-01-05 (火) 04:55:47 (1201d)  

C++11/マルチスレッド
Top / C++11 / マルチスレッド

規格書で読むC++11のスレッド from Kohsuke Yuasa
C++ マルチスレッドプログラミング from Kohsuke Yuasa

クラス

C++標準ライブラリ提供クラスのデータ競合に関する基本ルール

  • クラスオブジェクトのconstメンバ関数呼び出しは、オブジェクトに対する読み込み操作とみなす。
  • クラスオブジェクトの非constメンバ関数呼び出しは、オブジェクトに対する変更操作とみなす。(一部例外事項あり)
    • 追加的な例外事項として、begin, endやatなどの一部の非constメンバ関数ではオブジェクト自身の内部状態を変更しないため、これらもデータ競合に関してはconstメンバ関数相当(=読み込み操作)とみなします。
    • 特殊化されたstd::vector<bool>だけは、異なる要素へのアクセスであってもデータ競合が発生する可能性があります
  • C++標準ライブラリでは「異なるstd::shared_ptrオブジェクトに対するメンバ関数呼び出しは、その参照先に関わらずデータ競合を引き起こさない」と明確に保証しています
    • 参照カウント更新はatomic変数操作(または排他制御あり変数更新)にて行われる

標準入出力

  • 標準入出力ストリームオブジェクトに対する入力/出力操作は、排他制御を行わなくてもデータ競合を引き起こさない

スレッド/終了

  • threadオブジェクトがjoinもdetachもせずにデストラクトされるとstd::terminateを呼び出して強制終了

参照を渡す

参考