次の方法で共有


ミューテックス オブジェクト

ミューテックス オブジェクト は、状態が任意のスレッドによって所有されていないときにシグナル通知に設定され、所有されている場合は非署名の同期オブジェクトです。 ミューテックス オブジェクトを所有できるスレッドは一度に 1 つだけです。その名前は、共有リソースへの相互排他アクセスの調整に役立ちます。 たとえば、2 つのスレッドが同時に共有メモリに書き込まれるのを防ぐために、各スレッドはミューテックス オブジェクトの所有権を待機してから、メモリにアクセスするコードを実行します。 共有メモリに書き込んだ後、スレッドはミューテックス オブジェクトを解放します。

スレッドは、CreateMutex または CreateMutexEx関数使用してミューテックス オブジェクトを作成します。 作成スレッドはミューテックス オブジェクトの即時所有権を要求でき、ミューテックス オブジェクトの名前を指定することもできます。 名前のないミューテックスを作成することもできます。 ミューテックス、イベント、セマフォ、タイマー オブジェクトの名前の詳細については、「プロセス間同期 を参照してください。

他のプロセスのスレッドは、OpenMutex 関数の呼び出しで名前を指定することで、既存の名前付きミューテックス オブジェクトへのハンドルを開くことができます。 名前のないミューテックスにハンドルを別のプロセスに渡すには、DuplicateHandle関数または親子ハンドル継承使用します。

ミューテックス オブジェクトへのハンドルを持つスレッドは、ミューテックス オブジェクトの所有権を要求するために 待機関数のいずれかを使用できます。 ミューテックス オブジェクトが別のスレッドによって所有されている場合、待機関数は、所有しているスレッドが ReleaseMutex 関数を使用してミューテックス オブジェクトを解放するまで、要求スレッドをブロックします。 待機関数の戻り値は、シグナルに設定されているミューテックスの状態以外の何らかの理由で関数が返されたかどうかを示します。

ミューテックスで複数のスレッドが待機している場合は、待機中のスレッドが選択されます。 先入れ先出し (FIFO) の順序は想定しないでください。 カーネル モードの APCs などの外部イベントは、待機順序を変更できます。

スレッドはミューテックスの所有権を取得した後、待機関数の繰り返し呼び出しで同じミューテックスを指定、その実行をブロックしません。 これにより、既に所有しているミューテックスを待機している間にスレッド自体がデッドロックするのを防ぐことができます。 このような状況で所有権を解放するには、ミューテックスが待機関数の条件を満たすたびに、スレッド ReleaseMutex を 1 回呼び出す必要があります。

ミューテックス オブジェクトの所有権を解放せずにスレッドが終了した場合、ミューテックス オブジェクトは破棄されたと見なされます。 待機中のスレッドは破棄されたミューテックス オブジェクトの所有権を取得できますが、待機関数はミューテックス オブジェクトが破棄されたことを示す WAIT_ABANDONED を返します。 破棄されたミューテックス オブジェクトは、エラーが発生し、ミューテックス オブジェクトによって保護されている共有リソースが未定義の状態であることを示します。 ミューテックス オブジェクトが破棄されていないかのようにスレッドが続行された場合、スレッドがその所有権を解放した後は破棄されたと見なされなくなります。 これにより、ミューテックス オブジェクトへのハンドルが待機関数で後で指定された場合、通常の動作が復元されます。

クリティカル セクション オブジェクト 、ミューテックス オブジェクトと同様の同期を提供。ただし、クリティカル セクション オブジェクトは 1 つのプロセスのスレッドでのみ使用できます。

ミューテックス オブジェクト を使用した