Win32多线程之 利用TerminateThread()放弃一个线程


 BOOL  TerminateThread(

     HANDLE   hThread,

     DWORD   dwExitCode

);


参数


hThread   欲令其结束线程的handle,该线程就是我们的行动目标。

dwExitCode   该线程的结束代码。


返回值

   如果函数成功,则传回TRUE。如果失败,则传回FALSE。GetLastError()可以获知更多细节。

TerminateThread()看起来不错,但其实它是一个危险的函数,应该在最不得已的情况下才使用“。

这是一个非常明白的警告。

   TerminateThread()强迫其行动目标(一个线程)结束,手段极其残忍,甚至在不允许该线程有任何挣扎的机会,这带来的副作用就是:线程没有机会再结束前清理自己。对线程而言,这可能导致前功尽弃。这个函数不会在目标线程中丢出一个异常情况(exception),目标线程在核心层面就被根本抹杀了。目标线程没有机会捕捉到所谓的”结束请求“,并从而获得清理的机会。

      还有一个令人不愉快的情况。目标线程的堆栈没有被释放掉。于是可能会引起一大块内存泄露(memory leak)。而且,任何一个与此县城有附着关系的DLL都没机会获得

”线程解除附着“的通知。

    此函数唯一可以预期并依持的是,线程handle将变成激发状态(因为线程结束了),并且传回dwExitCode所指定的结束代码。

这个函数所带来的隐伏危机还包括:如果线程正进入一个critical section中,该critical section将因此永远处于锁定状态,因为critical section不像mutex那样的有所谓的”abandoned“状态,如果目标线程正在更新一份数据结构,这份数据结构也将永远处于不稳定状态。没有任何办法可以阻止这些问题的发生。

   因此,最好别用TerminateThread()。

   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值