MEFのソースコードを参照すると、この部分が見つかりました。 誰かがロック内になぜMemoryBarrier
が必要なのか説明できますか?ここでThread.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);
}
に割り当てられた前に、この場合の
また、メモリバリアがimportEngine 新鮮 garanteeを提供*時々、ロックが十分 –
ではありませんそれは多くのコンテキストを知らなくても、この質問に答えることは不可能だと*ようです。 –
メモリモデルが脆弱なプロセッサではFUDですが、マイクロソフトのプログラマの中には、おそらくItaniumを習得する必要から回復しないものがあります。これは、_importEngine参照を使用するときに、完全に構築されたオブジェクトを別のスレッドが監視できることを保証します。弱いプロセッサでは、オブジェクトフィールドが書き込まれる前に参照がメモリに書き込まれ、別のスレッドが初期化されていないフィールド値を見ることができます。 .NET 2.0以降では必要ありません。ロックはすでにメモリの壁を意味するため、ここでは必ずしも必要ではありません。 –