web-dev-qa-db-ja.com

ロックとミューテックスの違いは何ですか?

ロックとミューテックスの違いは何ですか?なぜそれらを同じ意味で使用できないのですか?

115
Ram

lock はAppDomainに固有であり、 Mutex はオペレーティングシステムに固有であり、プロセス間ロックと同期(IPC)を実行できます。

130
Darin Dimitrov

lockはコンパイラのキーワードであり、実際のクラスまたはオブジェクトではありません。これは、Monitorクラスの機能のラッパーであり、一般的なケースでMonitorを扱いやすくするように設計されています。

Monitor(およびlockキーワード)は、Darinが言ったように、AppDomainに制限されています。主に、「ロック」を管理し、MonitorのIDを維持するには、メモリアドレスへの参照(インスタンス化されたオブジェクトの形式)が必要であるためです。

一方、Mutexは、オペレーティングシステム構造の.Netラッパーであり、文字列data(へのポインターの代わりに)を使用して、システム全体の同期に使用できます。データ)を識別子として。 2つの完全に異なるメモリアドレスの2つの文字列を参照するが、同じdataを持つ2つのミューテックスは、実際には同じオペレーティングシステムのミューテックスを利用します。

86
Toby

Mutexlocalのいずれかプロセスに対してまたはシステム全体になります。 [〜#〜] msdn [〜#〜]

ミューテックスには、名前のないローカルミューテックスと名前付きシステムミューテックスの2種類があります。ローカルミューテックスはプロセス内にのみ存在します。

さらに、ターミナルサービスを備えたシステムでシステム全体のミューテックスを使用する場合は、同じページに詳細が記載されている特別な注意が必要です。

Mutexlockの違いの1つは、Mutexカーネルレベルの構成 を使用するため、同期には常に少なくともユーザースペースとカーネルスペースが必要になることです。遷移。

lock-これは、実際には Monitorクラス へのショートカットです。一方で、カーネルリソースの割り当てとカーネルコードへの移行を回避しようとします(したがって、よりスリムで高速です)-類似するWinAPIコンストラクトを見つける必要がある場合、 CriticalSection )になります。

他の違いは、他の人が指摘していることです:a namedMutexcanはプロセス全体で使用できます。

特別なニーズがある場合、またはプロセス間で同期が必要な場合を除き、lock(別名Monitor)に固執することをお勧めします。

放棄の処理方法など、他にもいくつかの「小さな」違いがあります。

3.5のReaderWriterLockReaderWriterLockSlim 、. NET 4.0のSemaphoreおよび新しいSemaphoreSlimなどについても同じことが言えます。後者のxxSlimは事実です。クラスをシステム全体の同期プリミティブとして使用することはできませんが、クラスを意図したものではありませんでした。クラスは、より高速でリソースに優しいことを意図した「のみ」でした。

49
Andras Vass

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);
22
Jonathan

Mutexはクロスプロセスであり、アプリケーションの複数のインスタンスを実行しない典型的な例があります。

2番目の例は、ファイルがあり、別のプロセスが同じファイルにアクセスしたくない場合、Mutexを実装できますが、Mutexはオペレーティングシステム全体であり、2つのリモートプロセス間で使用できないことを覚えておいてください。

ロックはコードのセクションを保護する最も簡単な方法であり、appdomain固有であり、より制御された同期が必要な場合はロックをMonitersに置き換えることができます。

6
TalentTuner

すでに多くのことが言われていますが、簡単にするために、ここに私の見解を示します。

lock->使いやすい、モニターのラッパー、AppDomainのスレッド間でロックします。

名前のないミューテックス->ロックに似ていますが、ロックスコープがより多く、プロセス内のAppDomain全体にあります。

名前付きミューテックス->ロックスコープは、名前のないミューテックス以上のものであり、オペレーティングシステムのプロセス全体にわたっています。

オプションが用意されたので、あなたのケースに最適なものを選択する必要があります。

5