Win 32 多线程程序设计学习笔记之五:终止线程

本文探讨了在Win32环境下安全终止线程的多种方法,包括避免使用TerminateThread()的原因及其风险,使用信号的局限性,设置标记和事件对象的推荐方法,以及线程优先权的概念和调整。通过理解这些技术,可以更好地管理和结束线程,避免数据损坏和资源泄露。
摘要由CSDN通过智能技术生成

        如何在某个线程内终止另一个正在运行的线程?


1.利用TerminateThread() 放弃一个线程

BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);

参数
hThread 欲令其结束之线程的 handle。该线程就是我们的行动目标。
dwExitCode 该线程的结束代码。


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


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

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

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

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

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


2.使用信号(Signals)

        下一个似乎可行的想法是使用 signals。在 Unix 系统中,signals 是跨进程传送通告(notifications)的标准方法。在 Unix 系统中 SIGTERM 相当于“请你离开”的意思ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值