【发布时间】:2011-12-28 05:15:42
【问题描述】:
简而言之,来自 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?
- 据我了解,屏障在其后续指令之后阻止在其位置之前执行指令,我是否正确?
【问题讨论】:
-
对您有益的主要说明:永远不要编写需要任何这些的代码。使用
lock、InterLocked和其他标准类。 -
它更像是stackoverflow.com/questions/3493931/… 的副本,而不是链接的那个。
标签: c# multithreading memory-barriers