ミューテックス
更新 : 2007 年 11 月
Mutex オブジェクトを使用すると、リソースへの排他アクセスを提供できます。Mutex クラスは Monitor クラスより多くのシステム リソースを使用しますが、アプリケーションのドメイン境界を越えてマーシャリングでき、複数の待機操作と共に使用でき、異なるプロセスのスレッドを同期するために使用できます。マネージ同期メカニズムの比較については、「同期プリミティブの概要」を参照してください。
コード例については Mutex コンストラクタのリファレンス ドキュメントを参照してください。
ミューテックスの使用
スレッドは、ミューテックスの WaitOne メソッドを呼び出して所有権を要求します。この呼び出しは、ミューテックスが使用できるようになるまで、またはオプションのタイムアウト間隔が経過するまでブロックします。所有しているスレッドがない場合、ミューテックスはシグナル状態になります。
スレッドは、ReleaseMutex メソッドを呼び出してミューテックスを解放します。ミューテックスにはスレッド アフィニティがあり、解放できるのはスレッドが所有するミューテックスだけです。スレッドが所有していないミューテックスを解放すると、スレッドで ApplicationException がスローされます。
Mutex クラスは WaitHandle から派生し、WaitHandle の静的な WaitAll メソッドまたは WaitAny メソッドを呼び出して、他の待機ハンドルと組み合わせて Mutex の所有権を要求できます。
Mutex を所有するスレッドは、待機要求呼び出しを繰り返し行うときに、実行をブロックせずに同じ Mutex を指定できます。ただし呼び出しと同じ回数だけ Mutex を解放して、その所有権を解放する必要があります。
放棄されたミューテックス
スレッドが Mutex を解放せずに終了した場合、ミューテックスは放棄されたと言います。ミューテックスが保護しているリソースが矛盾した状態で残る可能性があるため、多くの場合、これは重大なプログラミング エラーを示します。.NET Framework Version 2.0 では、ミューテックスを取得する次のスレッドで AbandonedMutexException がスローされます。
メモ : |
---|
.NET Framework Version 1.0 および 1.1 では、放棄された Mutex はシグナル状態になり、次に待機中のスレッドが所有権を取得します。待機中のスレッドがない場合、Mutex はシグナル状態のままになります。例外をスローすることはありません。 |
システム全体で有効なミューテックスの場合、放棄されたミューテックスは、アプリケーションが (たとえば Windows タスク マネージャを使用して) 強制終了されたことを示す場合があります。
ローカル ミューテックスとシステム ミューテックス
ミューテックスには、ローカル ミューテックスと名前付きシステム ミューテックスの 2 つの種類があります。名前を受け入れるコンストラクタを使用して Mutex オブジェクトを作成すると、そのオブジェクトがその名前のオペレーティング システム オブジェクトに関連付けられます。名前付きシステム ミューテックスは、オペレーティング システムを介して参照でき、プロセスの活動を同期化する目的で使用できます。同じ名前付きシステム ミューテックスを表す複数の Mutex オブジェクトを作成できます。また、OpenExisting メソッドを使用して、既存の名前付きシステム ミューテックスを開くことができます。
ローカル ミューテックスは、現在のプロセス内部でのみ存在します。ローカル ミューテックスは、ローカル Mutex オブジェクトを参照するプロセス内のどのスレッドからでも使用できます。各 Mutex オブジェクトは個別のローカル ミューテックスです。
システム ミューテックスのアクセス制御セキュリティ
.NET Framework Version 2.0 では、名前付きシステム オブジェクトに対して Windows アクセス制御セキュリティを照会して設定できます。システム オブジェクトはグローバルで、外部のコードでもロックできるため、システム ミューテックスは作成した時点から保護することをお勧めします。
ミューテックスのアクセス制御セキュリティの詳細については、MutexSecurity クラスと MutexAccessRule クラス、MutexRights 列挙体、Mutex クラスの GetAccessControl、SetAccessControl、OpenExisting の各メソッド、およびMutex(Boolean, String, Boolean%, MutexSecurity) コンストラクタを参照してください。