Mutex オブジェクトを使用して、リソースへの排他的アクセスを提供できます。 Mutex クラスは、Monitor クラスよりも多くのシステム リソースを使用しますが、アプリケーション ドメインの境界を越えてマーシャリングしたり、複数の待機で使用したり、異なるプロセスのスレッドを同期するために使用したりできます。 マネージド同期メカニズムの比較については、「 同期プリミティブの概要」を参照してください。
コード例については、 Mutex コンストラクターのリファレンス ドキュメントを参照してください。
ミューテックスを使用する
スレッドはミューテックスの WaitOne メソッドを呼び出して所有権を要求します。 ミューテックスが使用可能になるまで、またはオプションのタイムアウト間隔が経過するまで、呼び出しはブロックされます。 所有しているスレッドがない場合、ミューテックスはシグナル状態になります。
スレッドは、 ReleaseMutex メソッドを呼び出してミューテックスを解放します。 ミューテックスにはスレッド アフィニティがあります。つまり、ミューテックスは、ミューテックスを所有するスレッドによってのみ解放できます。 スレッドが所有していないミューテックスを解放すると、スレッドで ApplicationException がスローされます。
Mutex クラスはWaitHandleから派生しているため、WaitAllの静的WaitAnyまたはWaitHandleメソッドを呼び出して、他の待機ハンドルと組み合わせてMutexの所有権を要求することもできます。
スレッドが Mutexを所有している場合、そのスレッドは、実行をブロックすることなく、繰り返し待機要求呼び出しで同じ Mutex を指定できます。ただし、所有権を解放するには、 Mutex を何度も解放する必要があります。
破棄済みミューテックス
スレッドが Mutexを解放せずに終了すると、ミューテックスは破棄されると言われます。 ミューテックスが保護しているリソースが不整合な状態のままになっている可能性があるため、これは多くの場合、重大なプログラミング エラーを示します。 ミューテックスを取得する次のスレッドで AbandonedMutexException がスローされます。
システム全体のミューテックスの場合、破棄されたミューテックスは、アプリケーションが突然終了したことを示している可能性があります (たとえば、Windows タスク マネージャーを使用)。
ローカル ミューテックスとシステム ミューテックス
ミューテックスは、ローカル ミューテックスと名前付きシステム ミューテックスの 2 種類です。 名前を受け入れるコンストラクターを使用して Mutex オブジェクトを作成すると、その名前のオペレーティング システム オブジェクトに関連付けられます。 名前付きシステム ミューテックスはオペレーティング システム全体で表示され、プロセスのアクティビティを同期するために使用できます。 同じ名前付きシステム ミューテックスを表す複数の Mutex オブジェクトを作成でき、 OpenExisting メソッドを使用して既存の名前付きシステム ミューテックスを開くことができます。
ローカル ミューテックスは、プロセス内にのみ存在します。 ローカル Mutex オブジェクトへの参照を持つプロセス内の任意のスレッドで使用できます。 各 Mutex オブジェクトは、個別のローカル ミューテックスです。
システム ミューテックスのアクセス制御セキュリティ
.NET Framework には、名前付きシステム オブジェクトの Windows アクセス制御セキュリティのクエリと設定を行う機能が用意されています。 システム オブジェクトはグローバルであるため、独自のコード以外のコードでロックできるため、システム ミューテックスを作成時から保護することをお勧めします。
ミューテックスのアクセス制御セキュリティの詳細については、MutexSecurityクラスとMutexAccessRule クラス、MutexRights列挙体、GetAccessControl クラスのSetAccessControl、OpenExisting、およびMutexメソッド、およびMutex(Boolean, String, Boolean, MutexSecurity) コンストラクターを参照してください。
注
システム ミューテックスのアクセス制御セキュリティは .NET Framework でのみ使用できます。.NET Core または .NET 5 以降では使用できません。
こちらも参照ください
.NET