免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4563 | 回复: 10
打印 上一主题 下一主题

求教pthread_cancel [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-27 20:57 |只看该作者 |倒序浏览
某个线程,如果执行时间超过10小时还没有结束,希望能够在主线程中终止掉这个线程。
我现在直接调用pthread_cancel
后来网上查了一下,说这个函数不宜使用,调用的时候具体会做什么事情呢? 有什么需要注意的事项吗?

刚接触linux线程编程,哪位有相关资料能不能共享一下?

论坛徽章:
0
2 [报告]
发表于 2010-01-28 09:32 |只看该作者
被cancel必须至少要执行一个带cancel point的函数,最好自己给它发信号

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2010-01-28 09:41 |只看该作者
cancel 不好使,不如 kill

论坛徽章:
0
4 [报告]
发表于 2010-01-28 23:49 |只看该作者
我的某个线程,可能存在查表很长时间的情况, 我想直接杀掉这种线程,但是线程代码里,有一个自动解锁类的对象,这个对象在构造的时候lock ,在析构的时候unlock ,如果啥进程杀的不是时候(没有析构这个对象),后面的代码就死锁了。今天已经重现几次了。

我只是想杀掉线程的时候,能够析构线程内部分配的对象,至于全局的对象,倒是可以自己管理自己释放。

有什么办法可以做到吗?
cancel point怎么用啊  
望各位大哥赐教 谢谢!

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2010-01-29 00:02 |只看该作者

回复 #4 tcwn_feng 的帖子

嘿嘿, 当pthread_cancel遇见C++析构  

论坛徽章:
0
6 [报告]
发表于 2010-01-29 00:08 |只看该作者

回复 #5 OwnWaterloo 的帖子

真诚求教。  谢谢!

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2010-01-29 00:27 |只看该作者

回复 #6 tcwn_feng 的帖子

我也没办法……  pthread毕竟是一个C库, 不会为C++考虑太多。
C++的析构是需要执行代码才能完成的, 当thread死掉后, 就无法执行这些代码。

当然, 还要看thread是怎么死掉的。
比如有一个pthread-w32, 可以编译为使用C++异常来cancel一个thread。
当该异常抛出, 然后unwinding 所有frame时, 这些frame上的变量就有析构的机会。

估计你使用的应该不是这个库……



要想在所有pthread实现上都能工作 ……   可能需要放弃使用C++析构函数来完成cleanup。
用pthread_cleanup_push(pop)吧, 好像叫这个名字……
这要重写很多代码……  而且那些负责RAII的class全部作废……




或者……  出个歪主意 …… 不一定有效, 可以试试……

首先在线程函数上建立一个try 块, 在try块内执行所需工作。

void* my_thread_routine(void* arg ) {
      try {
            ... do work here
      }
      catch ( terminate_thread const& e) {
            return e.result;
      }
}

如果能够安装一个信号处理器, 让它在当前线程上抛出一个异常, 就可以解决这个问题。

int my_terminate(int sig) // 原型是这样???
{
      throw terminate_thread( result ); // 如果这个信号处理器确实是在需要被cancel的那个线程上执行的
      // 那应该就可以一直退回到my_thread_routine(除非当中有函数故意抓住这个exception)
      // 并且, 析构这些函数上的局部变量 —— 你的目的就达到了
}

如何安装这个信号处理器, 如何发送这个信号, 代码是否是在需要被取消的那个线程上执行 —— 这些问题我不懂……  靠你了兄弟
如果成功, 记得分享一下啊

评分

参与人数 1可用积分 +6 收起 理由
JohnBull + 6 我很赞同

查看全部评分

论坛徽章:
0
8 [报告]
发表于 2010-01-29 00:38 |只看该作者

回复 #7 OwnWaterloo 的帖子

采用C++封装(全部或部分)或类似智能指针的方式处理 , "借类的壳上市" , 应当也是可行方案.

论坛徽章:
0
9 [报告]
发表于 2010-01-29 08:57 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2010-01-29 23:43 |只看该作者
感谢各位!
搞不定pthread_cancel了。
下周二就要上线,决定去掉超时控制。
后面有空再试一下了~

谢谢!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP