为什么在这里使用Thread.MemoryBarrier?

时间:2015-09-28 13:05:07

标签: c# thread-safety

浏览MEF源代码我发现了这篇文章。 有人可以解释锁定中需要MemoryBarrier的原因吗?

整个方法是:

public void SatisfyImportsOnce(ComposablePart part)
{
    this.ThrowIfDisposed();

    if (this._importEngine == null)
    {
        ImportEngine importEngine = new ImportEngine(this, this._compositionOptions);

        lock(this._lock)
        {
            if (this._importEngine == null)
            {
                Thread.MemoryBarrier();
                this._importEngine = importEngine;
                importEngine = null;
            }
        }
        if(importEngine != null)
        {
            importEngine.Dispose();
        }
    }
    this._importEngine.SatisfyImportsOnce(part);
}

1 个答案:

答案 0 :(得分:1)

Thread.MemoryBarrier可防止抖动/编译器重新排序代码优化的任何指令。

Treading in C#, by Joe Albahari书中,他说:

  • 编译器,CLR或CPU可能会重新排序程序的指令以提高效率。
  • 编译器,CLR或CPU可能会引入缓存优化,以便其他线程不会立即看到对变量的赋值。

在此示例中,可能是缓存了importEngine或_importEngine值,并且必须立即通知所有线程有关更改的信息非常重要。

此情况下,MemoryBarrier在分配给_importEngine之前提供importEngine fresh garantee