ミューテックス オブジェクト
ミューテックス オブジェクトは同期オブジェクトであり、その状態はスレッドによって所有されておらず、所有されている場合は非割り当てに設定されます。 ミューテックス オブジェクトを所有できるスレッドは一度に 1 つだけです。その名前は、共有リソースへの相互排他的アクセスを調整するのに役立ちます。 たとえば、2 つのスレッドが共有メモリに同時に書き込むのを防ぐために、各スレッドはミューテックス オブジェクトの所有権を待機してから、メモリにアクセスするコードを実行します。 共有メモリに書き込みを行った後、スレッドはミューテックス オブジェクトを解放します。
スレッドは 、CreateMutex または CreateMutexEx 関数を使用してミューテックス オブジェクトを作成します。 作成するスレッドは、ミューテックス オブジェクトの即時所有権を要求できます。また、ミューテックス オブジェクトの名前を指定することもできます。 また、名前のないミューテックスを作成することもできます。 ミューテックス、イベント、セマフォ、およびタイマー オブジェクトの名前の詳細については、「 プロセス間同期」を参照してください。
他のプロセスのスレッドは、 OpenMutex 関数の呼び出しで名前を指定することで、既存の名前付きミューテックス オブジェクトへのハンドルを開くことができます。 名前のないミューテックスにハンドルを別のプロセスに渡すには、 DuplicateHandle 関数または親子ハンドルの継承を使用します。
ミューテックス オブジェクトへのハンドルを持つスレッドは、 いずれかの待機関数 を使用してミューテックス オブジェクトの所有権を要求できます。 ミューテックス オブジェクトが別のスレッドによって所有されている場合、待機関数は、所有しているスレッドが ReleaseMutex 関数を使用してミューテックス オブジェクトを解放するまで、要求元のスレッドをブロックします。 wait 関数の戻り値は、シグナルに設定されているミューテックスの状態以外の何らかの理由で関数が返されたかどうかを示します。
ミューテックスで複数のスレッドが待機している場合は、待機中のスレッドが選択されます。 先入れ先出し (FIFO) の順序は想定しないでください。 カーネル モードの APC などの外部イベントは、待機順序を変更できます。
スレッドはミューテックスの所有権を取得した後、 待機関数 の繰り返し呼び出しで同じミューテックスを指定できます。その実行はブロックされません。 これにより、既に所有しているミューテックスを待機している間にスレッド自体がデッドロックするのを防ぐことができます。 このような状況で所有権を解放するには、ミューテックスが待機関数の条件を満たすたびに、スレッドが ReleaseMutex を 1 回呼び出す必要があります。
ミューテックス オブジェクトの所有権を解放せずにスレッドが終了した場合、ミューテックス オブジェクトは破棄されたと見なされます。 待機中のスレッドは破棄されたミューテックス オブジェクトの所有権を取得できますが、待機関数はミューテックス オブジェクトが破棄されたことを示す WAIT_ABANDONED を返します。 破棄されたミューテックス オブジェクトは、エラーが発生し、ミューテックス オブジェクトによって保護されている共有リソースが未定義の状態であることを示します。 ミューテックス オブジェクトが破棄されていないかのようにスレッドが続行された場合、スレッドがその所有権を解放した後、破棄されたと見なされなくなります。 これにより、ミューテックス オブジェクトへのハンドルが待機関数で後で指定された場合、通常の動作が復元されます。
クリティカル セクション オブジェクトはミューテックス オブジェクトと同様の同期を提供しますが、クリティカル セクション オブジェクトは 1 つのプロセスのスレッドでのみ使用できる点に注意してください。
関連トピック