次の方法で共有


複数のスレッドの実行の同期

競合状態やデッドロックを回避するには、複数のスレッドによるアクセスを共有リソースに同期する必要があります。 また、相互依存コードが適切な順序で実行されるようにするために、同期も必要です。

ハンドルを使用して複数のスレッドを同期できるオブジェクトが多数あります。 これらのオブジェクトには、次のものが含まれます。

  • コンソール入力バッファー
  • イベント
  • ミューテックス
  • プロセス
  • セマフォ
  • Threads
  • タイマー

これらの各オブジェクトの状態は、シグナル通知されるか、シグナルが通知されません。 いずれかの待機関数の呼び出しでこれらのオブジェクトへのハンドルを指定すると、指定したオブジェクトの状態がシグナル通知されるまで、呼び出し元スレッドの実行がブロックされます。

これらのオブジェクトの一部は、何らかのイベントが発生するまでスレッドをブロックするのに役立ちます。 たとえば、キーストロークやマウス ボタンのクリックなど、未読入力がある場合、コンソール入力バッファー ハンドルに通知されます。 プロセス ハンドルとスレッド ハンドルは、プロセスまたはスレッドが終了すると通知されます。 これにより、たとえば、プロセスで子プロセスを作成し、新しいプロセスが終了するまで独自の実行をブロックできます。

他のオブジェクトは、共有リソースを同時アクセスから保護する場合に役立ちます。 たとえば、複数のスレッドがそれぞれミューテックス オブジェクトへのハンドルを持つことができます。 共有リソースにアクセスする前に、スレッドはミューテックスの状態が通知されるまで待機 関数 のいずれかを呼び出す必要があります。 ミューテックスがシグナル通知されると、リソースにアクセスするために解放される待機スレッドは 1 つだけです。 ミューテックスの状態は、他の待機中のスレッドがブロックされたままになるように、すぐに通知されないようにリセットされます。 スレッドがリソースで終了したら、他のスレッドがリソースにアクセスできるように、ミューテックスの状態を signaled に設定する必要があります。

1 つのプロセスのスレッドの場合、クリティカル セクション オブジェクトはミューテックスよりも効率的な同期手段を提供します。 クリティカル セクションはミューテックスのように使用され、保護されたリソースを一度に 1 つのスレッドで使用できます。 スレッドは EnterCriticalSection 関数を使用して、クリティカル セクションの所有権を要求できます。 既に別のスレッドによって所有されている場合、要求元のスレッドはブロックされます。 スレッドは TryEnterCriticalSection 関数を使用してクリティカル セクションの所有権を要求できます。クリティカル セクションの取得に失敗してもブロックされません。 所有権を受け取ると、スレッドは保護されたリソースを自由に使用できます。 プロセスの他のスレッドの実行は、同じクリティカル セクションに入ろうとしない限り影響を受けません。

WaitForInputIdle 関数は、指定されたプロセスが初期化されるまでスレッドを待機し、入力が保留中でないユーザー入力を待機します。 WaitForInputIdle の呼び出しは、子プロセスが初期化を完了するのを待たずに CreateProcess が返されるため、親プロセスと子プロセスの同期に役立ちます。

詳細については、「 同期」を参照してください。