次の方法で共有


TerminateThread 関数 (processthreadsapi.h)

スレッドを終了します。

構文

BOOL TerminateThread(
  [in, out] HANDLE hThread,
  [in]      DWORD  dwExitCode
);

パラメーター

[in, out] hThread

終了するスレッドへのハンドル。

ハンドルには、 THREAD_TERMINATE アクセス権が必要です。 詳細については、「 スレッド セキュリティとアクセス権」を参照してください。

[in] dwExitCode

スレッドの終了コード。 GetExitCodeThread 関数を使用して、スレッドの終了値を取得します。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

TerminateThread は、スレッドを終了させるために使用されます。 この場合、ターゲット スレッドはユーザー モード コードを実行する機会がありません。 スレッドにアタッチされている DLL は、スレッドが終了していることを通知されません。 システムは、スレッドの初期スタックを解放します。

Windows Server 2003 および Windows XP: ターゲット スレッドの初期スタックが解放されず、リソース リークが発生します。

TerminateThread は、最も極端なケースでのみ使用する必要がある危険な関数です。 TerminateThread を呼び出す必要があるのは、ターゲット スレッドの実行内容が正確にわかっていて、終了時にターゲット スレッドが実行されている可能性があるすべてのコードを制御する場合のみです。 たとえば、 TerminateThread では次の問題が発生する可能性があります。

  • ターゲット スレッドがクリティカル セクションを所有している場合、クリティカル セクションは解放されません。
  • ターゲット スレッドがヒープからメモリを割り当てる場合、ヒープ ロックは解放されません。
  • ターゲット スレッドが終了時に特定の kernel32 呼び出しを実行している場合、スレッドのプロセスの kernel32 状態に不整合が生じる可能性があります。
  • ターゲット スレッドが共有 DLL のグローバル状態を操作している場合、DLL の状態が破棄され、DLL の他のユーザーに影響を与える可能性があります。
スレッドは、ハンドルへのアクセスを制御する以外に、 TerminateThread から自身を保護できません。 CreateThread 関数と CreateProcess 関数によって返されるスレッド ハンドルにはTHREAD_TERMINATEアクセス権があるため、これらのハンドルのいずれかを保持している呼び出し元はスレッドを終了できます。

この関数が呼び出されたときにターゲット スレッドがプロセスの最後のスレッドである場合、スレッドのプロセスも終了します。

スレッド オブジェクトの状態が通知され、スレッドの終了を待機していた他のスレッドが解放されます。 スレッドの終了状態は 、STILL_ACTIVE から dwExitCode パラメーターの値に変わります。

スレッドを終了しても、必ずしもシステムからスレッド オブジェクトが削除されるとは限りません。 スレッド オブジェクトは、最後のスレッド ハンドルが閉じられると削除されます。

要件

要件
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー processthreadsapi.h (Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2 の Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

CreateProcess

CreateThread

ExitThread

GetExitCodeThread

OpenThread

プロセス関数とスレッド関数

スレッドの終了

スレッド