重複の可能性:
Thread.MemoryBarrier() が必要な理由
O'Reilly の C# からの要約:
class Foo
{
int _answer;
bool _complete;
void A()
{
_answer = 123;
Thread.MemoryBarrier(); // Barrier 1
_complete = true;
Thread.MemoryBarrier(); // Barrier 2
}
void B()
{
Thread.MemoryBarrier(); // Barrier 3
if (_complete)
{
Thread.MemoryBarrier(); // Barrier 4
Console.WriteLine (_answer);
}
}
}
メソッド A と B が異なるスレッドで同時に実行されたとします。
著者は次のように述べています。「バリア 1 と 4 により、この例では「0」を書き込むことができなくなります。バリア 2 と 3 により、鮮度が保証されます。B が A の後に実行された場合、_complete の読み取りが true と評価されることが保証されます。」
私の質問は次のとおりです。
- バリア 4 が必要な理由 バリア1じゃ足りない?
- なぜ 2 と 3 が必要なのですか?
- 私が理解していることから、バリアは次の命令の後にその場所の前に命令を実行することを防ぎます、私は正しいですか?