相关疑难解决方法(0)

这个C#代码是否会因为寄存器或缓存中的值永远不会写回主内存而失败?

在这篇文章中:

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上实现.我试图弄清楚我必须要编写一些可以在所有平台上运行的线程代码.

这是一个相关的问题:

C#线程是否真的可以缓存一个值并忽略其他线程上该值的更改?

但我认为接受的答案中的代码可能会通过循环读取提升进行优化,因此它无法证明内存可见性......

c# multithreading caching

4
推荐指数
1
解决办法
312
查看次数

标签 统计

c# ×1

caching ×1

multithreading ×1