我对以下代码示例有疑问(取自:http ://www.albahari.com/threading/part4.aspx#_NonBlockingSynch )
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);
}
}
}
紧随其后的是以下解释:
“障碍 1 和 4 阻止此示例写入“0”。障碍 2 和 3 提供新鲜度保证:它们确保如果 B 在 A 之后运行,读取 _complete 将评估为真。”
我了解使用内存屏障如何影响指令重新排序,但是提到的“新鲜度保证”是什么?
在文章的后面,也用到了下面的例子:
static void Main()
{
bool complete = false;
var t = new Thread (() =>
{
bool toggle = false;
while (!complete)
{
toggle = !toggle;
// adding a call to Thread.MemoryBarrier() here fixes the problem
}
});
t.Start();
Thread.Sleep (1000);
complete = true;
t.Join(); // Blocks indefinitely
}
这个例子后面跟着这个解释:
“这个程序永远不会终止,因为完整的变量缓存在 CPU 寄存器中。在 while 循环内插入对 Thread.MemoryBarrier 的调用(或锁定读取完成)可以修复错误。”
再说一遍......这里会发生什么?