スレッドの同期

WaitForSingleObject ルーチンと WaitForMultipleObjects ルーチンにより、スレッドは、スレッドの完了や他のスレッドからの信号といったさまざまな状況で待機することができます。これらのルーチンにより、スレッドとプロセスは無期限に、または指定されたタイムアウト期間が経過するまで、CPU リソースを全く消費せずに効率的に待機することができます。

WaitForSingleObject は、オブジェクト・ハンドルを第 1 パラメーターとして取得し、そのハンドルが参照するオブジェクトが信号を受け取った状態になるか、指定されたタイムアウト値が経過するまで返りません。構文は、次のとおりです。

WaitResult = WaitForSingleObject (ObjectHandle, [ Timeout ] )

タイムアウトを使用する場合、その値を第 2 パラメーターとしてミリ秒単位で指定します。WAIT_INFINITE 値は無期限のタイムアウトを表し、この場合、関数は ObjectHandle が完了するまで待機することになります。

WaitForMultipleObjects もこれと似ていますが、第 2 パラメーターが Windows* オブジェクト・ハンドルの配列である点が異なります。待機する対象となるハンドルの数を第 1 パラメーターに指定します。この値には、作成されたスレッドの総数よりも小さい値を指定することができます。最大値は 64 です。この関数は、すべてのイベントが完了するまで待機するか、いずれかのオブジェクトが完了した時点で実行を再開することができます。

スレッドが、決して利用可能にならないオブジェクトを待機すると、デッドロックが発生します。待機の対象となるスレッドが決して終了しない可能性がある場合、タイムアウト・パラメーターを使用してください。

スレッドの中断と再開

SuspendThread を使用すると、スレッドの実行を停止することができます。SuspendThread は、スレッドの実行が中断されるコードの位置を制御しないため、同期で特に便利なわけではありません。しかし、スレッドの作業を終了させるユーザー入力を確認する必要がある場合、スレッドを中断することができます。入力が確認されると、スレッドは終了されます。それ以外の場合は実行が再開されます。

中断状態で作成されたスレッドは、中断されたスレッドへのハンドルを指定して ResumeThread が呼び出されるまでは実行を開始しません。これは、スレッドが実行を開始する前に、その状態を初期化するときに便利です。スレッドの作成時の中断は、1 回限りの同期で有効です。ResumeThread は、中断されたスレッドがコードの開始位置から実行を再開することを保証します。