在“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);
}
这种需求对我来说似乎很疯狂。我如何识别所有可能发生这种情况的情况?我认为如果处理器改变操作顺序,它需要保证行为不会改变。
您是否费心使用障碍?