JLSの第17章では、 「起こる-一貫性を保つ前に」という概念を紹介しています。
一連のアクションAが発生します-一貫する前に、Aのすべての読み取りrについて、W(r)がrから見た書き込みアクションである場合、hb(r、W(r))またはwv = rvおよびhb(W(r)、w)およびhb(w、r)"となるような書き込みwがAに存在します。
私の理解では、それは次の言葉に等しい:...、それは...でも...でもない場合です。
したがって、最初の2つの質問は次のとおりです。
- 私の理解は正しいですか?
- 「wv=rv」とはどういう意味ですか?
また、例を示します:17.4.5-1
Thread 1 Thread 2
B = 1; A = 2;
r2 = A; r1 = B;
最初の実行順序:
1: B = 1;
3: A = 2;
2: r2 = A; // sees initial write of 0
4: r1 = B; // sees initial write of 0
注文自体は、2つのスレッドが交互に実行されることをすでに示しているので、私の3番目の質問は次のとおりです。
私の理解では、r2とr1の両方の理由は、最初の書き込みが0であることがわかるのは、AとBの両方が揮発性フィールドではないためです。ですから、私の4番目の質問は、私の理解が正しいかどうかということです。
2番目の実行順序:
1: r2 = A; // sees write of A = 2
3: r1 = B; // sees write of B = 1
2: B = 1;
4: A = 2;
発生前の一貫性の定義によると、この実行順序が発生する前に発生することを理解することは難しくありません(私の最初の理解が正しければ)。したがって、私の5番目と6番目の質問は次のとおりです。現実の世界にこの状況(読み取りは後で発生する書き込みを参照)が存在しますか?もしそうなら、私に実際の例を教えていただけますか?