终止线程
终止线程具有以下结果:
- 线程拥有的任何资源(如窗口和挂钩)将被释放。
- 设置线程退出代码。
- 线程对象已发出信号。
- 如果线程是进程中唯一的活动线程,则进程将终止。 有关详细信息,请参阅 终止进程。
GetExitCodeThread 函数返回线程的终止状态。 线程在执行时,其终止状态为STILL_ACTIVE。 当线程终止时,其终止状态从STILL_ACTIVE更改为线程的退出代码。
当线程终止时,线程对象的状态将更改为“已发出信号”,释放已等待线程终止的任何其他线程。 有关同步的详细信息,请参阅 同步多线程的执行。
当线程终止时,在关闭线程的所有打开句柄之前,不会释放其线程对象。
线程的终止方式
线程将执行,直到发生以下事件之一:
- 线程调用 ExitThread 函数。
- 进程的任何线程都调用 ExitProcess 函数。
- 线程函数返回 。
- 任何线程调用具有线程句柄的 TerminateThread 函数。
- 任何线程使用进程的句柄调用 TerminateProcess 函数。
线程的退出代码是在调用 ExitThread、 ExitProcess、 TerminateThread 或 TerminateProcess 中指定的值,或者线程函数返回的值。
如果线程被 ExitThread 终止,则系统会调用每个附加 DLL 的入口点函数,值指示线程正在从 DLL (分离,除非你) 调用 DisableThreadLibraryCalls 函数。 如果 线程被 ExitProcess 终止,则调用 DLL 入口点函数一次,以指示进程正在分离。 当线程被 TerminateThread 或 TerminateProcess 终止时,DLL 不会收到通知。 有关 DLL 的详细信息,请参阅 动态链接库。
TerminateThread 和 TerminateProcess 函数应仅在极端情况下使用,因为它们不允许线程清理、不通知附加的 DLL 以及不释放初始堆栈。 此外,在进程终止之前,线程拥有的 对象的句柄不会关闭。 以下步骤提供了更好的解决方案:
- 使用 CreateEvent 函数创建事件对象。
- 创建线程。
- 每个线程通过调用 WaitForSingleObject 函数来监视事件状态。 使用零的等待超时间隔。
- 当事件设置为信号状态时,每个线程终止其自己的执行, (WaitForSingleObject 返回WAIT_OBJECT_0) 。