简而言之,来自 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 将评估为真。”
我的问题是:
- 为什么需要屏障 4?屏障 1 还不够?
- 为什么需要 2 和 3 ?
- 据我了解,屏障在其以下指令之后阻止在其位置之前执行指令,我正确吗?