スレッドの終了
スレッドを終了すると、次の結果が得られます。
- ウィンドウやフックなど、スレッドが所有するすべてのリソースが解放されます。
- スレッド終了コードが設定されています。
- スレッド オブジェクトが通知されます。
- スレッドがプロセス内で唯一アクティブなスレッドである場合、プロセスは終了します。 詳細については、「 プロセスの終了」を参照してください。
GetExitCodeThread 関数は、スレッドの終了状態を返します。 スレッドの実行中、その終了状態はSTILL_ACTIVE。 スレッドが終了すると、その終了状態がSTILL_ACTIVEからスレッドの終了コードに変わります。
スレッドが終了すると、スレッド オブジェクトの状態が signaled に変わり、スレッドの終了を待機していた他のスレッドが解放されます。 同期の詳細については、「 複数スレッドの実行の同期」を参照してください。
スレッドが終了すると、スレッドに対するすべての開いているハンドルが閉じられるまで、スレッド オブジェクトは解放されません。
スレッドの終了方法
スレッドは、次のいずれかのイベントが発生するまで実行されます。
- スレッドは ExitThread 関数を呼び出します。
- プロセスのすべてのスレッドが ExitProcess 関数を呼び出します。
- スレッド関数は を返します。
- すべてのスレッドは、スレッドへのハンドルを使用して TerminateThread 関数を呼び出します。
- すべてのスレッドは、プロセスへのハンドルを使用して TerminateProcess 関数を呼び出します。
スレッドの終了コードは、ExitThread、ExitProcess、TerminateThread、または TerminateProcess の呼び出しで指定された値、またはスレッド関数によって返される値のいずれかです。
ExitThread によってスレッドが終了した場合、システムは、(DisableThreadLibraryCalls 関数を呼び出さない限り) スレッドが DLL からデタッチされていることを示す値を使用して、アタッチされている各 DLL のエントリ ポイント関数を呼び出します。 ExitProcess によってスレッドが終了した場合、プロセスがデタッチされていることを示すために、DLL エントリ ポイント関数が 1 回呼び出されます。 スレッドが TerminateThread または TerminateProcess によって終了された場合、DLL には通知されません。 DLL の詳細については、「 ダイナミック リンク ライブラリ」を参照してください。
TerminateThread 関数と TerminateProcess 関数は、スレッドのクリーンを許可せず、アタッチされた DLL に通知せず、初期スタックを解放しないため、極端な状況でのみ使用する必要があります。 さらに、スレッドが所有するオブジェクトへのハンドルは、プロセスが終了するまで閉じられません。 次の手順では、より優れたソリューションを提供します。
- CreateEvent 関数を使用してイベント オブジェクトを作成します。
- スレッドを作成します。
- 各スレッドは、 WaitForSingleObject 関数を呼び出してイベントの状態を監視します。 0 の待機タイムアウト間隔を使用します。
- イベントがシグナル状態に設定されると、各スレッドは独自の実行を終了します (WaitForSingleObject はWAIT_OBJECT_0を返します)。