"C# 4 in a Nutshell" で、著者は、このクラスが 0 なしで書き込めることがあることを示していますがMemoryBarrier
、私の Core2Duo では再現できません。
public class Foo
{
int _answer;
bool _complete;
public void A()
{
_answer = 123;
//Thread.MemoryBarrier(); // Barrier 1
_complete = true;
//Thread.MemoryBarrier(); // Barrier 2
}
public void B()
{
//Thread.MemoryBarrier(); // Barrier 3
if (_complete)
{
//Thread.MemoryBarrier(); // Barrier 4
Console.WriteLine(_answer);
}
}
}
private static void ThreadInverteOrdemComandos()
{
Foo obj = new Foo();
Task.Factory.StartNew(obj.A);
Task.Factory.StartNew(obj.B);
Thread.Sleep(10);
}
この必要性は私にはクレイジーに思えます。これが発生する可能性のあるすべてのケースをどのように認識できますか? プロセッサが操作の順序を変更した場合、動作が変わらないことを保証する必要があると思います。
わざわざバリアを使用しますか?