国际站怎么登录

你的位置:国际站怎么登录 > 新闻动态 >

【数媒在线课堂】线程终止

点击次数:167 新闻动态 发布日期:2025-04-15 06:35:01
TerminateThread 与 ExitThread 是有区别的,当使用 ExitThread 来终止一个线程时,该线程的堆栈也会被销毁;但是如果使用 TerminateThread 来终止一个线程,除了该线程所属的进程终止,那么系统将

TerminateThread 与 ExitThread 是有区别的,当使用 ExitThread 来终止一个线程时,该线程的堆栈也会被销毁;但是如果使用 TerminateThread 来终止一个线程,除了该线程所属的进程终止,那么系统将不会销毁该线程的堆栈。 Microsoft 故意以这种方式来实现 TerminateThread,原因是当其他线程要引用被【杀死】的线程堆栈上的值时,为了避免引起访问违例,所以不销毁该堆栈。

DLL 通常会在线程终止时收到通知,但是,如果线程是用 TerminateThread 被杀死的,那么 DLL 将不会收到通知。

线程终止时发生如下:

① 线程创建的所有用户对象句柄被释放,在 windows 中大多数对象都是由包含了【创建这些对象的线程】的【进程】拥有的。 但是线程的两个用户对象:【窗口】(window) 和【挂钩】(hook),一个线程终止时,系统会自动销毁由线程创建或安装的任何窗口,并卸载由线程创建或安装的任何挂钩。 而除了【窗口】和【挂钩】之外的其他用户对象只有在该线程所属进程终止时才被销毁。

② 线程的退出代码从 STILL_ACTIVE 变为传给 ExitThread 或 TerminateThread 的代码

③ 线程内核对象的状态变为触发状态

④ 如果线程是进程中的最后一个活动线程,那么系统认为进程也该终止了

⑤ 线程内核对象的使用计数减一

线程终止时,其关联的线程对象不会自动释放,除非对这个对象的所有未结束的引用都被关闭了。

发布于:湖南省