ミューテックス

Mutex オブジェクトを使用して、リソースへの排他的アクセスを提供できます。 Mutex クラスは Monitor クラスよりも多くのシステム リソースを使用しますが、アプリケーション ドメイン境界を越えてマーシャリングしたり、複数の待機操作とともに使用したり、異なるプロセスのスレッドを同期するために使用できます。 マネージド同期メカニズムの比較については、「同期プリミティブの概要」を参照してください。

コード例については、Mutex コンストラクターのリファレンス ドキュメントを参照してください。

ミューテックスを使用する

スレッドはミューテックスの WaitOne メソッドを呼び出して、所有権を要求します。 この呼び出しは、ミューテックスを使用できるようになるまで、あるいはオプションのタイムアウト期間を超過するまでブロックします。 所有しているスレッドがない場合、ミューテックスはシグナル状態になります。

スレッドは ReleaseMutex メソッドを呼び出して、ミューテックスを解放します。 ミューテックスにはスレッド アフィニティがあります。つまり、ミューテックスはそれを所有するスレッドによってのみ解放することができます。 スレッドが所有していないミューテックスを解放すると、スレッドで ApplicationException がスローされます。

Mutex クラスは WaitHandle から派生するため、WaitHandle の静的な WaitAll または WaitAny メソッドを呼び出し、他の待機ハンドルと組み合わせで Mutex の所有権を要求することもできます。

スレッドが Mutex を所有している場合、そのスレッドは待機要求呼び出しを繰り返し行うときに、実行をブロックせずに同じ Mutex を指定できます。ただし、呼び出しと同じ回数だけ Mutex を解放して、その所有権を解放する必要があります。

破棄済みミューテックス

Mutex を解放せずにスレッドが終了すると、ミューテックスは破棄されたと見なされます。 ミューテックスが保護しているリソースが矛盾した状態で残る可能性があるため、多くの場合、これは重大なプログラミング エラーを示します。 ミューテックスを取得する次のスレッドで AbandonedMutexException がスローされます。

システム全体でミューテックスが有効な場合にミューテックスが破棄されたときは、アプリケーションが強制終了されたことを示している可能性があります (たとえば、Windows タスク マネージャを使用した終了)。

ローカル ミューテックスとシステム ミューテックス

ミュー テックスには、ローカル ミューテックスと名前付きシステム ミューテックスという 2 つの種類があります。 名前を受け入れるコンストラクターを使用して Mutex オブジェクトを作成すると、そのオブジェクトがその名前のオペレーティング システム オブジェクトに関連付けられます。 名前付きシステム ミューテックスは、オペレーティング システム全体から参照でき、プロセスの動作を同期するために使用できます。 同じ名前付きシステム ミューテックスを表す複数の Mutex オブジェクトを作成できます。また、OpenExisting メソッドを使用して、既存の名前付きシステム ミューテックスを開くことができます。

ローカル ミューテックスは、現在のプロセス内にのみ存在します。 ローカル Mutex オブジェクトを参照するプロセス内のすべてのスレッドから使用できます。 Mutex オブジェクトはそれぞれ別のローカル ミューテックスです。

システム ミューテックスのアクセス制御セキュリティ

.NET Framework では、名前付きシステム オブジェクトに対して Windows アクセス制御セキュリティのクエリを実行し、設定することができます。 システム オブジェクトはグローバルであり、所有するコード以外のコードによってロックできるため、作成時からシステム ミューテックスを保護することをお勧めします。

ミューテックスのアクセス制御セキュリティについては、MutexSecurity および MutexAccessRule クラス、MutexRights 列挙体、Mutex クラスの GetAccessControlSetAccessControlOpenExisting メソッド、Mutex(Boolean, String, Boolean, MutexSecurity) コンストラクターに関するページを参照してください。

注意

システム ミューテックスのアクセス制御セキュリティは、.NET Framework でのみ使用できます。.NET Core または .NET 5 以降では使用できません。

関連項目