为什么是线程?这里使用MemoryBarrier

本文关键字:MemoryBarrier 这里 线程 为什么 | 更新日期: 2023-09-27 18:14:47

浏览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);
}

为什么是线程?这里使用MemoryBarrier

线程。MemoryBarrier防止抖动/编译器为代码优化重新排序任何指令。

在Joe Albahari的书中,他说:

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

在本例中,可能会缓存importEngine或_importEngine值,并且必须立即通知所有线程有关更改,这一点非常重要。

在这种情况下MemoryBarrier在分配给_importEngine

之前提供了importEngine新鲜度保证