C#内存模型 - 轮询循环不会挂起

时间:2015-01-19 23:55:01

标签: c# loops memory jit

前几天我读了下面关于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解决了。

那么这个问题的原因是什么?我希望有人能给我一个具体的答案。

0 个答案:

没有答案