.NETでロックvsメモリバリアを使用するタイミング
-
18-09-2019 - |
質問
.netで lock
キーワードは周囲の構文砂糖です Monitor.Enter
と Monitor.Exit
, 、だからあなたはこのコードと言うことができます
lock(locker)
{
// Do something
}
と同じです
Monitor.Enter(locker);
try
{
// Do Something
}
finally
{
Monitor.Exit(locker);
}
ただし、.NETフレームワークには、 MemoryBarrier
同様の方法で機能するクラス
Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();
使いたいときのように混乱しています Thread.MemoryBarrier
オーバー lock
/Monitor
バージョン?私はさらに混乱しています スレッドチュートリアル それらは同じように機能していると述べています。
私が見ることができる限り、目に見える違いはロックオブジェクトを必要としません。 Monitor
スレッドを越えて何かをすることができます MemoryBarrier
単一のスレッドにあります。
私の腸は私に別の重要な違いがあると言っています MemoryBarrier
変数専用であり、メソッド用ではありません。
最後に、これは既存の質問とは関係ありません ThreadSafeロックコードで「Volatile」または「Thread.MemoryBarrier()」をいつ使用するのですか? (C#), 、それがに焦点を合わせているので volatile
その使用法を理解しているキーワード。
解決
私の見解では、あなたはほとんどすべきです 一度もない 使用する Thread.MemoryBarrier
. 。これはに使用されます ロックフリー コード - ロックのコストを負担することなく、あるスレッドで行われた変更が別のスレッドに表示されることを確認します。します いいえ とは異なり、スレッドの同期を制御します lock
. 。ジョーのチュートリアルのどこに彼が言っているのかわかりません MemoryBarrier
「同じ」と同じように lock
. 。その印象をどこから得ているのかを説明してもらえますか?
私の見解では、主な習熟度が同時性である開発者以外のほとんどの人にとって、低レベルのロックフリーコードは困難すぎます。ロックフリーコードを書きたい場合は、より高いレベルのビルディングブロックを使用します 構築されています これらの開発者(.NET 4.0の並列拡張など)が自分のものを転がそうとするのではなく。
例として、私は最近、正確な意味に目を向けました volatile
どれの そうではありません 「常にメインメモリから読んで、常にメインメモリに直接書きます」。 (私自身のスレッドチュートリアルにはまだその説明があります - ある時点で修正する必要があるものです。) それよりもはるかに微妙です. 。この意味は いくつか 私の以前の使用の volatile
間違っている可能性があります。