スレッドの終了

スレッドを終了すると、次の結果が得られます。

  • ウィンドウやフックなど、スレッドが所有するすべてのリソースが解放されます。
  • スレッド終了コードが設定されています。
  • スレッド オブジェクトが通知されます。
  • スレッドがプロセス内で唯一アクティブなスレッドである場合、プロセスは終了します。 詳細については、「 プロセスの終了」を参照してください。

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を返します)。