终止线程

终止线程具有以下结果:

  • 线程拥有的任何资源(如窗口和挂钩)将被释放。
  • 设置线程退出代码。
  • 线程对象已发出信号。
  • 如果线程是进程中唯一的活动线程,则进程将终止。 有关详细信息,请参阅 终止进程

GetExitCodeThread 函数返回线程的终止状态。 线程在执行时,其终止状态为STILL_ACTIVE。 当线程终止时,其终止状态从STILL_ACTIVE更改为线程的退出代码。

当线程终止时,线程对象的状态将更改为“已发出信号”,释放已等待线程终止的任何其他线程。 有关同步的详细信息,请参阅 同步多线程的执行

当线程终止时,在关闭线程的所有打开句柄之前,不会释放其线程对象。

线程的终止方式

线程将执行,直到发生以下事件之一:

线程的退出代码是在调用 ExitThreadExitProcessTerminateThreadTerminateProcess 中指定的值,或者线程函数返回的值。

如果线程被 ExitThread 终止,则系统会调用每个附加 DLL 的入口点函数,值指示线程正在从 DLL (分离,除非你) 调用 DisableThreadLibraryCalls 函数。 如果 线程被 ExitProcess 终止,则调用 DLL 入口点函数一次,以指示进程正在分离。 当线程被 TerminateThreadTerminateProcess 终止时,DLL 不会收到通知。 有关 DLL 的详细信息,请参阅 动态链接库

TerminateThreadTerminateProcess 函数应仅在极端情况下使用,因为它们不允许线程清理、不通知附加的 DLL 以及不释放初始堆栈。 此外,在进程终止之前,线程拥有的 对象的句柄不会关闭。 以下步骤提供了更好的解决方案:

  • 使用 CreateEvent 函数创建事件对象。
  • 创建线程。
  • 每个线程通过调用 WaitForSingleObject 函数来监视事件状态。 使用零的等待超时间隔。
  • 当事件设置为信号状态时,每个线程终止其自己的执行, (WaitForSingleObject 返回WAIT_OBJECT_0) 。