ミューテックスMutexes

Mutex オブジェクトを使用して、リソースへの排他的アクセスを提供できます。You can use a Mutex object to provide exclusive access to a resource. Mutex クラスは Monitor クラスよりも多くのシステム リソースを使用しますが、アプリケーション ドメイン境界を越えてマーシャリングしたり、複数の待機操作とともに使用したり、異なるプロセスのスレッドを同期するために使用できます。The Mutex class uses more system resources than the Monitor class, but it can be marshaled across application domain boundaries, it can be used with multiple waits, and it can be used to synchronize threads in different processes. マネージド同期メカニズムの比較については、「同期プリミティブの概要」を参照してください。For a comparison of managed synchronization mechanisms, see Overview of Synchronization Primitives.

コード例については、Mutex コンストラクターのリファレンス ドキュメントを参照してください。For code examples, see the reference documentation for the Mutex constructors.

ミューテックスの使用Using Mutexes

スレッドはミューテックスの WaitOne メソッドを呼び出して、所有権を要求します。A thread calls the WaitOne method of a mutex to request ownership. この呼び出しは、ミューテックスを使用できるようになるまで、あるいはオプションのタイムアウト期間を超過するまでブロックします。The call blocks until the mutex is available, or until the optional timeout interval elapses. 所有しているスレッドがない場合、ミューテックスはシグナル状態になります。The state of a mutex is signaled if no thread owns it.

スレッドは ReleaseMutex メソッドを呼び出して、ミューテックスを解放します。A thread releases a mutex by calling its ReleaseMutex method. ミューテックスにはスレッド アフィニティがあります。つまり、ミューテックスはそれを所有するスレッドによってのみ解放することができます。Mutexes have thread affinity; that is, the mutex can be released only by the thread that owns it. スレッドが所有していないミューテックスを解放すると、スレッドで ApplicationException がスローされます。If a thread releases a mutex it does not own, an ApplicationException is thrown in the thread.

Mutex クラスは WaitHandle から派生するため、WaitHandle の静的な WaitAll または WaitAny メソッドを呼び出し、他の待機ハンドルと組み合わせで Mutex の所有権を要求することもできます。Because the Mutex class derives from WaitHandle, you can also call the static WaitAll or WaitAny methods of WaitHandle to request ownership of a Mutex in combination with other wait handles.

スレッドが Mutex を所有している場合、そのスレッドは待機要求呼び出しを繰り返し行うときに、実行をブロックせずに同じ Mutex を指定できます。ただし、呼び出しと同じ回数だけ Mutex を解放して、その所有権を解放する必要があります。If a thread owns a Mutex, that thread can specify the same Mutex in repeated wait-request calls without blocking its execution; however, it must release the Mutex as many times to release ownership.

破棄済みミューテックスAbandoned Mutexes

Mutex を解放せずにスレッドが終了すると、ミューテックスは破棄されたと見なされます。If a thread terminates without releasing a Mutex, the mutex is said to be abandoned. ミューテックスが保護しているリソースが矛盾した状態で残る可能性があるため、多くの場合、これは重大なプログラミング エラーを示します。This often indicates a serious programming error because the resource the mutex is protecting might be left in an inconsistent state. .NET Framework Version 2.0 では、ミューテックスを取得する次のスレッドで AbandonedMutexException がスローされます。In the .NET Framework version 2.0, an AbandonedMutexException is thrown in the next thread that acquires the mutex.

注意

.NET Framework Version 1.0 および 1.1 では、破棄された Mutex はシグナル状態に設定され、次の待機スレッドが所有権を取得します。In the .NET Framework versions 1.0 and 1.1, an abandoned Mutex is set to the signaled state and the next waiting thread gets ownership. 待機しているスレッドがない場合、Mutex はシグナル状態のままになります。If no thread is waiting, the Mutex remains in a signaled state. 例外をスローすることはありません。No exception is thrown.

システム全体でミューテックスが有効な場合にミューテックスが破棄されたときは、アプリケーションが強制終了されたことを示している可能性があります (たとえば、Windows タスク マネージャを使用した終了)。In the case of a system-wide mutex, an abandoned mutex might indicate that an application has been terminated abruptly (for example, by using Windows Task Manager).

ローカル ミューテックスとシステム ミューテックスLocal and System Mutexes

ミュー テックスには、ローカル ミューテックスと名前付きシステム ミューテックスという 2 つの種類があります。Mutexes are of two types: local mutexes and named system mutexes. 名前を受け入れるコンストラクターを使用して Mutex オブジェクトを作成すると、そのオブジェクトがその名前のオペレーティング システム オブジェクトに関連付けられます。If you create a Mutex object using a constructor that accepts a name, it is associated with an operating-system object of that name. 名前付きシステム ミューテックスは、オペレーティング システム全体から参照でき、プロセスの動作を同期するために使用できます。Named system mutexes are visible throughout the operating system and can be used to synchronize the activities of processes. 同じ名前付きシステム ミューテックスを表す複数の Mutex オブジェクトを作成できます。また、OpenExisting メソッドを使用して、既存の名前付きシステム ミューテックスを開くことができます。You can create multiple Mutex objects that represent the same named system mutex, and you can use the OpenExisting method to open an existing named system mutex.

ローカル ミューテックスは、現在のプロセス内にのみ存在します。A local mutex exists only within your process. ローカル Mutex オブジェクトを参照するプロセス内のすべてのスレッドから使用できます。It can be used by any thread in your process that has a reference to the local Mutex object. Mutex オブジェクトはそれぞれ別のローカル ミューテックスです。Each Mutex object is a separate local mutex.

システム ミューテックスのアクセス制御セキュリティAccess Control Security for System Mutexes

.NET Framework Version 2.0 では、名前付きシステム オブジェクトに対して Windows アクセス制御セキュリティを照会して設定できます。The .NET Framework version 2.0 provides the ability to query and set Windows access control security for named system objects. システム オブジェクトはグローバルであり、所有するコード以外のコードによってロックできるため、作成時からシステム ミューテックスを保護することをお勧めします。Protecting system mutexes from the moment of creation is recommended because system objects are global and therefore can be locked by code other than your own.

ミューテックスのアクセス制御セキュリティについては、MutexSecurity および MutexAccessRule クラス、MutexRights 列挙体、Mutex クラスの GetAccessControlSetAccessControlOpenExisting メソッド、Mutex(Boolean, String, Boolean, MutexSecurity) コンストラクターに関するページを参照してください。For information on access control security for mutexes, see the MutexSecurity and MutexAccessRule classes, the MutexRights enumeration, the GetAccessControl, SetAccessControl, and OpenExisting methods of the Mutex class, and the Mutex(Boolean, String, Boolean, MutexSecurity) constructor.

関連項目See also