同期オブジェクト
同期オブジェクトは、複数のスレッドの実行を調整するために待機関数の 1 つでハンドルを指定できるオブジェクトです。 複数のプロセスが同じ同期オブジェクトへのハンドルを持つ可能性があり、プロセス間同期が可能になります。
次のオブジェクトの種類は、同期専用に提供されます。
型 | 説明 |
---|---|
Event | イベントが発生したことを、1 つ以上の待機中のスレッドに通知します。 詳細については、「 イベント オブジェクト」を参照してください。 |
Mutex | 一度に 1 つのスレッドのみが所有できるため、スレッドは共有リソースへの相互排他アクセスを調整できます。 詳細については、「 Mutex オブジェクト」を参照してください。 |
Semaphore | 0 から最大値までの数を保持し、共有リソースに同時にアクセスするスレッドの数を制限します。 詳細については、「 セマフォ オブジェクト」を参照してください。 |
待機可能タイマー | 指定した時刻が到着したことを 1 つ以上の待機中のスレッドに通知します。 詳細については、「 待機可能タイマー オブジェクト」を参照してください。 |
他の用途でも使用できますが、同期には次のオブジェクトを使用することもできます。
Object | 説明 |
---|---|
変更通知 | FindFirstChangeNotification 関数によって作成された状態は、指定した種類の変更が指定されたディレクトリまたはディレクトリ ツリー内で発生したときにシグナルに設定されます。 詳細については、「 ディレクトリ変更通知の取得」を参照してください。 |
コンソール入力 | コンソールの作成時に作成されます。 コンソール入力へのハンドルは、CONIN$ が指定されている場合は CreateFile 関数によって、または GetStdHandle 関数によって返されます。 その状態は、コンソールの入力バッファーに未読入力がある場合は signaled に設定され、入力バッファーが空の場合は非署名に設定されます。 コンソールの詳細については、「文字モード アプリケーション」を参照してください。 |
ジョブ | CreateJobObject 関数を呼び出して作成されます。 ジョブ オブジェクトの状態は、指定したジョブの終了時間制限を超えたために、すべてのプロセスが終了したときにシグナルに設定されます。 ジョブ オブジェクトの詳細については、「 ジョブ オブジェクト」を参照してください。 |
メモリ リソース通知 | CreateMemoryResourceNotification 関数によって作成されます。 その状態は、物理メモリ内で指定された種類の変更が発生したときに通知されます。 メモリの詳細については、「 メモリ管理」を参照してください。 |
Process | CreateProcess 関数を呼び出して作成されます。 その状態は、プロセスの実行中に非署名に設定され、プロセスの終了時に シグナルに設定されます。 プロセスの詳細については、「 プロセスとスレッド」を参照してください。 |
スレッド | CreateProcess、CreateThread、または CreateRemoteThread 関数を呼び出して、新しいスレッドが作成されたときに作成されます。 その状態は、スレッドの実行中に非割り当てに設定され、スレッドの終了時に signaled に設定されます。 スレッドの詳細については、「 プロセスとスレッド」を参照してください。 |
状況によっては、ファイル、名前付きパイプ、または通信デバイスを同期オブジェクトとして使用することもできます。ただし、この目的での使用はお勧めしません。 代わりに、非同期 I/O を使用し、 OVERLAPPED 構造体で設定されたイベント オブジェクトを待機します。 同じファイル、名前付きパイプ、または通信デバイスで複数の同時重複操作が実行されると混乱が発生する可能性があるため、イベント オブジェクトを使用する方が安全です。 この状況では、オブジェクトの状態が通知される原因となった操作を知る方法はありません。
ファイル、名前付きパイプ、または通信に対する I/O 操作の詳細については、「 同期と重複した入出力」を参照してください。