为什么是线程?这里使用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防止抖动/编译器为代码优化重新排序任何指令。
在Joe Albahari的书中,他说:
- 编译器、CLR或CPU可能会重新排序你的程序指令以提高效率。
- 编译器、CLR或CPU可能会引入缓存优化,这样对变量的赋值不会立即对其他线程可见。
在本例中,可能会缓存importEngine或_importEngine值,并且必须立即通知所有线程有关更改,这一点非常重要。
在这种情况下MemoryBarrier在分配给_importEngine