在这篇文章中:
http://msdn.microsoft.com/en-us/magazine/jj883956.aspx
作者声明,由于"循环读取提升",以下代码可能会失败:
class Test
{
private bool _flag = true;
public void Run()
{
// Set _flag to false on another thread
new Thread(() => { _flag = false; }).Start();
// Poll the _flag field until it is set to false
while (_flag) ;
// The loop might never terminate!
}
}
Run Code Online (Sandbox Code Playgroud)
在循环读取提升中,由于单线程假设,编译器可能会将上面的while循环更改为以下内容:
if (_flag) { while (true); }
Run Code Online (Sandbox Code Playgroud)
我想知道的是:如果编译器没有执行该优化,由于一个处理器更新寄存器或缓存中的_flag并且从不将该缓存刷新回到多处理器机器上,因此循环仍有可能永远在多处理器机器上运行内存可以被其他线程读取?我已经读到"C#写入是易失性的",但是我链接的文章说ECMA规范实际上并没有保证这一点,并且事情没有在ARM上实现.我试图弄清楚我必须要编写一些可以在所有平台上运行的线程代码.
这是一个相关的问题:
但我认为接受的答案中的代码可能会通过循环读取提升进行优化,因此它无法证明内存可见性......