- byte(1.7/p1): 一意なアドレスを持つ, 少なくとも8ビット幅を持つ基本ストレージ単位.
- memory location(1.7/p3): スカラ型オブジェクト or 隣接する非0幅ビットフィールドの最大列
- conflict(1.10/p4): 同一memory locationに対する, 少なくとも一方が変更を行う, 2つのアクションにより生じる.
- data race(1.10/p21): 少なくとも一方が非atomicで, それぞれ他方に先行(hb)しない, 異なるスレッド上での2つのconflictするアクションで生じる. あらゆるdata raceは未定義の動作(undefined behavior)を引き起こす.
アクション
- evaluation(1.9/p12): 値の計算(value computation) or side effectの開始 (本文書中では"アクション"と表記)
- side effect(1.9/p12): 実行環境の状態を変化させるアクション. オブジェクトの更新 or volatile変数へのアクセス or I/Oライブラリ関数の呼出
- visible side effect(1.10/p13): スカラ型オブジェクトM上の値の計算(value computation)Bに対するM上のvisible side effect Aは, (A hb B) かつ (A hb X かつ X hb Bを満たすM上のside effect Xが存在しない) とき, アクションBはアクションAでM上へ書込まれた値を読出す.
二項関係
- sb - sequenced before(1.9/p13): 単一スレッド上での2つのアクション同士の関係. A sb B = 実行Aは実行Bに先行(hb)する.
- sw - synchronize with(1.10/p8): 異なるスレッド上での2つの特定ライブラリ呼出間の関係(release/acquire操作のペア). A sw B = 呼出Aは呼出Bに先行(hb)する.
- cad - carries a dependency(1.10/p9): 単一スレッド上でのsb関係のサブセット. A cad B = (Aがスカラ型オブジェクトMに書込 かつ BがMから読出 かつ A sb B) or (A cad X => X cad B) or (Aの値がBのオペランドとして使われる かつ NOT(Bが
std::kill_dependency
呼出 or Aが組込論理和積演算子||
,&&
の左辺 or Aが条件演算子?:
の左辺 or Aが組込コンマ演算子,
の左辺)) - dob - dependency-ordered before(1.10/p10): 異なるスレッド上での2つのアクション同士の関係(release/consume操作のペア). A dob B = (AがatomicオブジェクトM上のrelease操作 かつ Bが異なるスレッドからM上のconsume操作 かつ Aに続くrelease sequence内のいずれかのside effect書込をBが読出) or (A dob X => X cad B)
- ithb - inter-thread happens before(1.10/p11): 異なるスレッド上での2つのアクション同士の関係. A ithb B = (A sw B) or (A dob B) or (A sw X => X sb B) or (A sb X => X ithb B) or (A ithb X => X ithb B)
- hb - happens before(1.10/p12): 2つのアクション同士の関係. A hb B = (A sb B) or (A ithb B) = (A sb B) or (A sw B) or (release/consume操作による二項関係)
凡例:"あるアクションXに対してA (r1) X かつ X (r2) Bを満たす"とき, "A (r1) X => X (r2) B"と表記する.
シーケンス
- modification order(1.10/p6): ある1つのatomicオブジェクトに対して, ある全順序で生じた, 全ての変更の列.
- visible sequence of side effects(1.10/p14): atomicオブジェクトM上の値の計算(value computation)Bに対するM上のvisible sequence of side effectsは, アクションBに対して最初に可視となるside effectから, Bが該当side effectに先行(hb)しない, Mのmodification order上で最大限連続するside effectの部分列.
- release sequence(1.10/p7): atomicオブジェクトM上のrelease操作Aを先頭とする, Mのmodification order上で (Aと同一スレッド上で行われるside effect) or (atomic RMW操作) から構成される最大限連続するside effectの部分列.
- SC操作の全順序(29.3/p3): 全ての
SC
操作上ではある全順序Sが成り立つ. atomicオブジェクトMから値を読出すSC
操作Bは, (S上でBに先行するM上で直近のSC
変更A) or (SC
変更Aが存在するとき, Bに対するvisible sequence of side effects上でのM上のSC
操作でなく かつ Aに先行(hb)しない変更) or (SC
変更Aが存在しないとき, Bに対するvisible sequence of side effects上でのM上のSC
操作でない変更) いずれかの結果を観測する. - hypothetical release sequence(29.8): release fence操作Aのsw関係記述において, A sb Xのとき, atomic操作Xを先頭とする仮想的なrelease sequence.
凡例:SC=std::memory_order_seq_cst
コヒーレンス要件
- write-write coherence(1.10/p15): atomicオブジェクトM上で変更操作A hb 変更操作Bならば, memory order上でAはBより前にあるべき.
- read-read coherence(1.10/p16): atomicオブジェクトM上で(vc-A hb vc-B かつ vc-Aがse-Xから値を読み取る)ならば, vc-Bは(Xで格納された値 or memory order上でse-Xに続くse-Yで格納された値)のいずれかを読み取るべき.
- read-write coherence(1.10/p17):
- write-read coherence(1.10/p18):
凡例:vc-X=値の計算(value computation)X, se-X=side effect X
SC関連
- 29.3/p3: se(SC) → vc-B(SC)
- 29.3/p4: se(SC) → fence-X(SC) sb vc-B
- 29.3/p5: se-A sb fence-X(SC) → vc-B(SC)
- 29.3/p6: se-A sb fence-X(SC) → fence-Y(SC) sb vc-B
- 29.3/p7: RMW-A sb fence-X(SC) → fence-Y(SC) sb RMW-B