gpt4 book ai didi

c# - 这里为什么要用 Thread.MemoryBarrier 呢?

转载 作者:太空狗 更新时间:2023-10-29 21:57:09 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

在这种情况下,MemoryBarrier 在分配给 _importEngine 之前还提供了 importEngine 新鲜度保证

关于c# - 这里为什么要用 Thread.MemoryBarrier 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32823737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com