前几天我读了下面关于C#内存模型的文章: http://msdn.microsoft.com/en-us/magazine/jj863136.aspx
本文指出,当使用普通(即非易失性)字段时,允许JIT编译器重新排序内存操作。
图9展示了一个应该被破坏的轮询循环的例子:
class PollingLoopExample
{
private bool _loop = true;
public static void Main()
{
PollingLoopExample test1 = new PollingLoopExample();
// Set _loop to false on another thread
new Thread(() => { test1._loop = false;}).Start();
// Poll the _loop field until it is set to false
while (test1._loop) ;
// The previous loop may never terminate
}
}
该文本指出,在x86和x64架构上,轮询循环示例通常会挂起。我立即尝试了这一点,但不管我运行它的频率如何,投票循环都没有挂起一次。
这让我想到了为什么它不再起作用的问题(假设它过去曾在工作过)。我可以想象这个问题已经通过错误修复或更新版本的.NET解决了。
那么这个问题的原因是什么?我希望有人能给我一个具体的答案。