Linux环境下pthread_cancel对循环线程失效问题求助
问题解答
关于pthread_cancel的理解纠正
你的理解存在偏差:pthread_cancel只是向目标线程发送取消请求,不会直接强制终止线程。线程只有在执行到取消点时,才会检查并响应这个请求。休眠类函数(比如sleep)属于标准取消点,但并非所有"运行中"的线程状态都能响应取消——只有当线程执行到特定的取消点操作时,才会处理取消请求。
代码问题分析
注释掉
while (1);时:
线程启用取消状态后,会执行sleep(1000),而sleep是标准取消点。主线程在9秒后发送取消请求时,子线程正处于sleep阶段,会立即检测到取消请求并终止,因此取消成功。保留
while (1);时:
这个空循环是无任何取消点的无限循环。线程启用取消状态后,会一直卡在这个循环里,永远不会执行到后面的sleep(取消点),自然不会检查并响应主线程的取消请求,所以取消操作看起来"失效"了。
补充:让循环线程响应取消的方法
如果需要在循环中支持取消,可以通过以下方式添加取消检查:
- 显式调用
pthread_testcancel():这个函数是专门用来触发取消检查的显式取消点,修改后的循环示例:while (1) { pthread_testcancel(); // 主动检查是否有取消请求 } - 在循环中加入自带取消点的操作:比如添加短时间的
sleep(1),让线程有机会处理取消请求。
内容的提问来源于stack exchange,提问作者tahzibi.jafar
相关产品推荐
相关产品推荐

