终止线程

终止线程具有以下结果:

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

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

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

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

线程的终止方式

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

线程的退出代码是在调用 ExitThread、 ExitProcess、 TerminateThread 或 TerminateProcess 中指定的值,或者线程函数返回的值。

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

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

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