.NET中的内存重新排序

时间:2015-04-09 09:05:49

标签: c# .net memory msdn

msdn杂志文章https://msdn.microsoft.com/en-us/magazine/jj863136.aspx

中有一个例子
class BoxedInt
{
  public int Value { get; set; }
}
class LazyInit
{
  volatile BoxedInt _box;
  public int LazyGet()
  {
    var b = _box;  // Read 1
    if (b == null)
    {
      lock(this)
      {
        b = new BoxedInt();
        b.Value = 42; // Write 1
        _box = b;     // Write 2
      }
    }
    return b.Value; // Read 2
  }
}

据说:

  

在此示例中,LazyGet始终保证返回“42”。但是,   如果_box字段不易变,则允许LazyGet   返回“0”有两个原因:读取可以重新排序,或者   写入可以重新排序。

我理解为什么当"写1"时,函数可以返回0。和"写2"重新排序,但是如果重新排序读取,假设写入没有重新排序,它怎么能返回0。考虑到存在数据依赖性,如何对读取进行重新排序?

0 个答案:

没有答案