主线程 如何控制 子线程

当我开始在 Win32 上使用线程时,这个问题就一直在折磨我。我花了数天甚至数周的时间来寻找答案,并且希望找到的是一个好答案。
这个问题是:

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



TerminateThread() 强迫其行动目标(一个线程)结束,手段激烈而有力,甚至不允许该线程有任何“挣扎”的机会。这带来的副作用便是,线程没有机会在结束前清理自己。

对线程而言,这可能导致前功尽弃。这个函数不会在目标线程中丢出一个异常情况( exception),目标线程在核心层面就被根本抹杀了。目标线程没有机会捕捉所谓的“结束请求”,并从而获得清理自己的机会。

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


这个函数所带来的隐伏危机还包括: 如果线程正进入一个 critical section之中,该critical section 将因此永远处于锁定状态。


我的结论是:离 Term inateThread() 远远地!


正确的方法:

设立一个标记
当所有方法都失败时,不妨返朴归真,回到最简单最明白的路上。 Win32 准的做法是在你的程序代码中设立一个标记,利用其值来要求线程结束自己。


在京麦代码中,使用的是一个bool变量。在子线程的run()函数中,在几个需要长时间操作之前,先检查下该bool变量的值。

如果该bool值为false了,那么子线程直接就退出。


主线程通过子线程的setValue()方法,改变该bool值。


当然setValue()方法和run()方法中,对该bool值的访问都必须要加锁。

因为主线程中,会调用setValue()方法改变该bool值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值