可能是重复问题:
为什么我们需要Thread.MemoryBarrier()?
来自O'Reilly的C# in a Nutshell:
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将评估为真。”
我的问题是:
- 为什么需要屏障4?屏障1不足以吗?
- 为什么需要2和3?
- 据我所了解,屏障防止在其位置之前执行指令,在其后续指令之后执行,我是正确的吗?