using
ロックヘルパーとは、ステートメントを介してロックを実装できる使い捨てオブジェクトを指しています。たとえば、Jon Skeet の MiscUtilSyncLock
のクラスの典型的な使用法を考えてみましょう。
public class Example
{
private readonly SyncLock _padlock;
public Example()
{
_padlock = new SyncLock();
}
public void ConcurrentMethod()
{
using (_padlock.Lock())
{
// Now own the padlock - do concurrent stuff
}
}
}
ここで、次の使用法を検討してください。
var example = new Example();
new Thread(example.ConcurrentMethod).Start();
私の質問はこれです -example
はあるスレッドで作成されConcurrentMethod
、別のスレッドで呼び出されるため、ConcurrentMethod
のスレッドはコンストラクターでの の割り当てを忘れることはできませんでした(_padock
スレッドのキャッシュ/読み書きの並べ替えのため)。自体)?NullReferenceException
_padLock
Monitor
/によるロックにはメモリバリアの利点があることは知っていlock
ますが、これらのようなロックヘルパーを使用すると、そのようなバリアが保証される理由がわかりません。その場合、私が理解している限り、コンストラクターを変更する必要があります。
public Example()
{
_padlock = new SyncLock();
Thread.MemoryBarrier();
}
出典:マルチスレッド アプリにおけるローロック テクニックの影響の理解
EDIT Hans Passant は、スレッドの作成がメモリバリアを意味することを示唆しています。それではどうですか:
var example = new Example();
ThreadPool.QueueUserWorkItem(s => example.ConcurrentMethod());
現在、スレッドは必ずしも作成されているわけではありません...