为什么直接杀死线程是不好的

直接杀死线程可能导致资源无法回收和死锁。线程可能持有锁或占用资源,被强杀后这些资源将无法释放,引发其他线程死锁。正确做法是通过通知机制让线程优雅退出,避免耗时操作和无限循环。对于耗时操作,应将其分解为小任务,允许取消。对于死锁,应避免四个必要条件同时存在。
摘要由CSDN通过智能技术生成

我们知道,windows里有个API叫TerminateThread,它可以干掉任何正在欢快小跑的线程。对应的,liunx里则是pthread_cancel(不是pthread_kill,这玩意本质是向线程发信号,而不是杀死线程)加上PTHREAD_CANCEL_ASYNCHRONOUS。

但是我们同时也看到,不论是哪种方法,在它们的手册里都不推荐我们使用它们。

比如微软的msdn中对TerminateThread的描述:

TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination.

再比如Pthread API Reference中的一段话:

It is recommended that your application not use asynchronous thread cancelation via the PTHREAD_CANCEL_ASYNCHRONOUS option of pthread_setcanceltype().

特别的,在C++11的标准库中干脆去掉了Thread的Cancellation;在某些语言中(比如Python),我们甚至无法由外部强制终止某个线程。

那么为什么直接杀死线程是不好的呢?

我们来打个比方吧。比如你是一个幼儿园老师,让班里的10个小朋友一起对着一个鸡蛋画画。你给每个小朋友分了桌子、椅子、画笔和纸,限定了画画时间是10分钟。小朋友们画啊画啊,10个小朋友有9个都画完了,可是最后还剩一个小朋友“天赋异禀”,面前的稿纸堆成了山,坚持要像达芬奇那样一丝不苟的画出一只完美的蛋。于是你快步走到他的面前,一巴掌把他拍出了教室,然后一把火把他坐过的桌子椅子,用过的画笔稿纸也都烧成了灰……
等等,这什么情况……桌子椅子画笔稿纸干嘛要烧掉嘛,明明还可以用啊……是的,没错。可这就是强杀一个线程带来的后果,所有这个线程正在使用的资源我们也别想回收了。

当然,凡事都有例外。在上面这个开玩笑试的比喻里,如果我们原本的计划是所有小朋友画完以后就炸毁幼儿园(进程退出)的话,这么玩这些小朋友似乎也不错【喂!
可是对于很多情况(应该说,大部分情况),我们是需要得到这些小朋友的绘画结果,然后请出这批小朋友,换入下一批小朋友。学校啊桌子啊椅子啊什么的,能复用是尽量要复用的。要不然少一个小朋友座位也少一个,这学校也就开不下去了。

所以一般来说,我们退出线程的手段是通知它们,“时间到啦,是时候收工啦”,然后等着它们一个个干完手头的工作,还原使用的资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值