TerminateThread函数学习

TerminateThread函数学习终结一个线程 BOOLWINAPITe Inout nbsp nbsp HANDLEhThrea In nbsp nbsp nbsp nbsp nbsp DWORDdwExitC ParametershT nbsp in out 要终结线程的句柄 这个句柄必须有 THREAD TERMINATE 权利 dwExitCode nbsp in 线程的退出值

终结一个线程。

BOOL WINAPI TerminateThread( _Inout_  HANDLE hThread, _In_     DWORD dwExitCode );

Parameters

hThread [in, out]

要终结线程的句柄。这个句柄必须有THREAD_TERMINATE权利。

dwExitCode [in]

线程的退出值。

返回值

如果函数成功,返回非0值。

如果失败,返回0.

注意

函数是用来推出线程。当函数调执行,目标线程没有机会执行任何用户级代码。与DLL关联的线程不被通知就终结了。系统是否线程的初始栈。

Windows Server 2003 and Windows XP:  目标线程的栈没被释放,会引起资源泄漏。

本函数是危险的,只能在极端情况下运用。如果你知道目标线程正在做什么,你可以调用TerminateThread;而且你可以控制目标线程在终结时运行的代码。比如,TerminateThread调用可能会引起下列问题:

  • 如果目标线程拥有关键段,那么关键段不会被释放。【这将引起资源泄漏和死锁】
  • 如果目标线程在堆上申请内存,不会被释放。【内存泄漏】
  • 如果目标线程执行某个kernel32调用,当天终结时,对于线程所在进程的kernel32状态会不连续。
  • 如果目标线程在操作一个共享DLL的全局状态,DLL的状态可能被破坏,从而影响DLL的其他使用者。

调用了TerminateThread,线程就不能自我保护,没有控制自己handle的权利了。通过CreateThread和CreateProcess返回的线程句柄用THREAD_TERMINATE的权利,因此任何调用者都能通过这些句柄来终结这个线程。

如果目标线程是进程的最后一个线程,线程的进程也会终结。

线程对象的状态会被激发,释放任何其他线程等待此线程终结的信号。【也就是WaitForSingleObject[threadID,]会变为激发态】

终止一个线程没有必要从系统移除线程对象。当最后一个线程句柄关闭时线程对象被删除。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209759.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午8:29
下一篇 2026年3月19日 上午8:29


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号