ロックとミューテックスの違いは何ですか?なぜそれらを同じ意味で使用できないのですか?
lock
はコンパイラのキーワードであり、実際のクラスまたはオブジェクトではありません。これは、Monitor
クラスの機能のラッパーであり、一般的なケースでMonitor
を扱いやすくするように設計されています。
Monitor
(およびlock
キーワード)は、Darinが言ったように、AppDomain
に制限されています。主に、「ロック」を管理し、Monitor
のIDを維持するには、メモリアドレスへの参照(インスタンス化されたオブジェクトの形式)が必要であるためです。
一方、Mutex
は、オペレーティングシステム構造の.Netラッパーであり、文字列data(へのポインターの代わりに)を使用して、システム全体の同期に使用できます。データ)を識別子として。 2つの完全に異なるメモリアドレスの2つの文字列を参照するが、同じdataを持つ2つのミューテックスは、実際には同じオペレーティングシステムのミューテックスを利用します。
Mutex
はlocalのいずれかプロセスに対してまたはシステム全体になります。 [〜#〜] msdn [〜#〜] :
ミューテックスには、名前のないローカルミューテックスと名前付きシステムミューテックスの2種類があります。ローカルミューテックスはプロセス内にのみ存在します。
さらに、ターミナルサービスを備えたシステムでシステム全体のミューテックスを使用する場合は、同じページに詳細が記載されている特別な注意が必要です。
Mutex
とlock
の違いの1つは、Mutex
が カーネルレベルの構成 を使用するため、同期には常に少なくともユーザースペースとカーネルスペースが必要になることです。遷移。
lock
-これは、実際には Monitor
クラス へのショートカットです。一方で、カーネルリソースの割り当てとカーネルコードへの移行を回避しようとします(したがって、よりスリムで高速です)-類似するWinAPIコンストラクトを見つける必要がある場合、 CriticalSection
)になります。
他の違いは、他の人が指摘していることです:a namedMutex
canはプロセス全体で使用できます。
特別なニーズがある場合、またはプロセス間で同期が必要な場合を除き、lock
(別名Monitor
)に固執することをお勧めします。
放棄の処理方法など、他にもいくつかの「小さな」違いがあります。
3.5のReaderWriterLock
とReaderWriterLockSlim
、. NET 4.0のSemaphore
および新しいSemaphoreSlim
などについても同じことが言えます。後者のxxSlim
は事実です。クラスをシステム全体の同期プリミティブとして使用することはできませんが、クラスを意図したものではありませんでした。クラスは、より高速でリソースに優しいことを意図した「のみ」でした。
Mutexを使用して、同じマシンで実行中のアプリケーションのコピーが既にあるかどうかを確認します。
bool firstInstance;
Mutex mutex = new Mutex(false, @"Local\DASHBOARD_MAIN_APPLICATION", out firstInstance);
if (!firstInstance)
{
//another copy of this application running
}
else
{
//run main application loop here.
}
// Refer to the mutex down here so garbage collection doesn't chuck it out.
GC.KeepAlive(mutex);
Mutexはクロスプロセスであり、アプリケーションの複数のインスタンスを実行しない典型的な例があります。
2番目の例は、ファイルがあり、別のプロセスが同じファイルにアクセスしたくない場合、Mutexを実装できますが、Mutexはオペレーティングシステム全体であり、2つのリモートプロセス間で使用できないことを覚えておいてください。
ロックはコードのセクションを保護する最も簡単な方法であり、appdomain固有であり、より制御された同期が必要な場合はロックをMonitersに置き換えることができます。
すでに多くのことが言われていますが、簡単にするために、ここに私の見解を示します。
lock->使いやすい、モニターのラッパー、AppDomainのスレッド間でロックします。
名前のないミューテックス->ロックに似ていますが、ロックスコープがより多く、プロセス内のAppDomain全体にあります。
名前付きミューテックス->ロックスコープは、名前のないミューテックス以上のものであり、オペレーティングシステムのプロセス全体にわたっています。
オプションが用意されたので、あなたのケースに最適なものを選択する必要があります。