为了账号安全,请及时绑定邮箱和手机立即绑定

关于C语言 杀死线程Api函数的问题,求助~

关于C语言 杀死线程Api函数的问题,求助~

HUH函数 2021-12-15 19:11:22
bGetExit=GetExitCodeThread(hThreadRcvData,&exitcode );printf("%d",exitcode);//通过这样我获得了线程ThreadRcvData的退出码,并在屏幕上显示是2590,接着调用TerminateThread函数杀死线程bClose=TerminateThread(hThreadRcvData,2590);可是为什么bClose返回的是0,也就是说并没有杀死成功,我是哪个地方理解错了吗?
查看完整描述

2 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

GetExitCodeThread函数可以得到线程终结时的返回值,因为线程终结了,所以系统中不再有这个线程,hThreadRcvData本身已经无效,所以调用TerminateThread函数会失败。

查看完整回答
反对 回复 2021-12-19
?
富国沪深

TA贡献1790条经验 获得超9个赞

如果线程还没结束,你调用 GetExitCodeThread() 会返回 STILL_ACTIVE,其值等于103。
如果线程已经结束,就没必要调用TerminateThread()了。
“中止”( terminate)一个线程并不是一个好主意。停止或完全的退出一个线程反而更安全。MSDN文档在TerminateThread API中说到TerminateThread是一个很危险的函数,只能在很极端的情况下才可以使用。只有当你确切知道目标线程是做什么的,并且你可以控制所有目标线程在结束时可能会运行到的代码,这时候才可以调用TerminateThread。例如,TerminateThread会产生如下问题:
·如果目标线程有一个临界区(critical section),这临界区将不会被释放。
·如果目标线程在堆里分配了内存,堆锁(heap lock)将不会被释放。
·如果目标线程在结束时调用了某些kernel32,这样在线程的过程中的kernel32状态会不一致。
·如果目标线程正操作着一个共享库的全局状态,这个库的状态会被破坏,影响到其他的这个库的使用者。
也许结束一个线程最可靠的方法就是确定这个线程不休眠无限期的等待下去。一个支持线程被要求停止,它必须定期的检查看它是否被要求停止或者如果它在休眠的话看它是否能够被唤醒。支持这两个情况最简单的的方法就是使用同步对象,这样应用程序的线程和问题中的线程能互相沟通。当应用程序希望关闭线程时,只要设置这个同步对象,等待线程退出。之后,线程把这个同步对象作为它周期性监测的一部分,定期检查,或者如果这个同步对象的状态改变的话,唤醒它,还可以执行清空和退出线程函数。



查看完整回答
反对 回复 2021-12-19
  • 2 回答
  • 0 关注
  • 243 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信