TerminateThread 与 ExitThread 是有区别的,当使用 ExitThread 来终止一个线程时,该线程的堆栈也会被销毁;但是如果使用 TerminateThread 来终止一个线程,除了该线程所属的进程终止,那么系统将不会销毁该线程的堆栈。 Microsoft 故意以这种方式来实现 TerminateThread,原因是当其他线程要引用被【杀死】的线程堆栈上的值时,为了避免引起访问违例,所以不销毁该堆栈。
DLL 通常会在线程终止时收到通知,但是,如果线程是用 TerminateThread 被杀死的,那么 DLL 将不会收到通知。
线程终止时发生如下:
① 线程创建的所有用户对象句柄被释放,在 windows 中大多数对象都是由包含了【创建这些对象的线程】的【进程】拥有的。 但是线程的两个用户对象:【窗口】(window) 和【挂钩】(hook),一个线程终止时,系统会自动销毁由线程创建或安装的任何窗口,并卸载由线程创建或安装的任何挂钩。 而除了【窗口】和【挂钩】之外的其他用户对象只有在该线程所属进程终止时才被销毁。
② 线程的退出代码从 STILL_ACTIVE 变为传给 ExitThread 或 TerminateThread 的代码
③ 线程内核对象的状态变为触发状态
④ 如果线程是进程中的最后一个活动线程,那么系统认为进程也该终止了
⑤ 线程内核对象的使用计数减一
线程终止时,其关联的线程对象不会自动释放,除非对这个对象的所有未结束的引用都被关闭了。
发布于:湖南省