免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bottles
打印 上一主题 下一主题

[C++] 多线程问题 [复制链接]

论坛徽章:
5
双鱼座
日期:2013-11-26 17:56:26狮子座
日期:2013-11-29 15:41:32处女座
日期:2014-02-21 11:59:07技术图书徽章
日期:2014-03-06 15:33:53技术图书徽章
日期:2014-03-06 15:39:30
11 [报告]
发表于 2013-10-21 16:47 |只看该作者
回复 10# myworkstation


    额,也不全是,那个cond wait的似乎没问题了,现在就是没有cond wait的死循环线程有问题,我在那个线程里面调用了pipe去读取外部命令,然后主线程关闭这个线程的时候会时不时的打印出:
Original exception was:
close failed in file object destructor:
Error in sys.excepthook:
这种错误,也就是说在pipe打开的时候线程响应了pthread_cancel的消息?
我刚刚在打开pipe之前加了
pthread_testcancel();
pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, NULL);
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
然后再关闭pipe之后加上
pthread_setcancelstate(PTHREAD_CANCEL_ENABLe, NULL);
也没解决这个问题。。按照手册上不是说,如果吧cancelstate改成disable了,就不会响应pthread_cancel的讯号了吗?

论坛徽章:
5
双鱼座
日期:2013-11-26 17:56:26狮子座
日期:2013-11-29 15:41:32处女座
日期:2014-02-21 11:59:07技术图书徽章
日期:2014-03-06 15:33:53技术图书徽章
日期:2014-03-06 15:39:30
12 [报告]
发表于 2013-10-21 16:49 |只看该作者
似乎所有的回答都建议我不要用pthread_cancel,额,那我在研究研究吧,如果实在不行就改成变量的形式退出了。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
13 [报告]
发表于 2013-10-21 17:52 |只看该作者
回复 12# bottles


    本来就应该变量控制流程,让其主动友好的退出。pthread_cancel是下下策中的下下策,如果你还是要抱着这个不放,那么只能请自便了。

论坛徽章:
5
双鱼座
日期:2013-11-26 17:56:26狮子座
日期:2013-11-29 15:41:32处女座
日期:2014-02-21 11:59:07技术图书徽章
日期:2014-03-06 15:33:53技术图书徽章
日期:2014-03-06 15:39:30
14 [报告]
发表于 2013-10-23 00:46 |只看该作者
我必须说,我花了2天时间,终于把这个问题调试出来了,pthead_cancel是完全可以用的,目前没看出来有什么设计缺陷,之所以出现这种情况,是因为那个线程在打开popen的时候,由于那个命令需要运行的时间比较长,如果popen马上再pclose,就会出现这种情况。这种错误出现的原因是: 我打开了pipe,但是在没有完全运行的情况下就接受了pthread_cancel发来的消息,然后线程开始关闭,这时运行pclose,就会导致之前的错误。pthread_cancel是一个很好的设计接口,我觉得应该多使用,而不是因为有误用的风险而放在一边。
我的经验是:
用 pthread_setcancelstate将不想要cancel point的地方disable掉,然后在需要cancel point的地方加上pthread_testcancel,之后配送pthread_cleanup_push和pthread_cleanup_pop注册注销的hook函数,这样就不会有资源清除不干净的问题,这个hook函数所在的线程跟原来的线程是一个线程里的,最后,要在主线程当中加上pthread_join block住,不要让主线程先退出了。
这样做的话就能完美使用这套api了。

论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00
15 [报告]
发表于 2013-10-23 04:32 |只看该作者
本帖最后由 fly3ds 于 2013-10-23 04:49 编辑

回复 14# bottles

恭喜。

如果有其他的Solairs FreeBSD 甚至是其他的Linux机器,拿上去运行看看,看看能否还能跑的动。

另外,做过压力测试了吧?    等把这些都搞定再来宣传你的经验也不迟    

pthread_kill去掉了没? 如果没去掉,那就是搞定了,同样值得恭喜,毕竟是很麻烦的东西。

线程的信号处理函数与进程信号处理函数的编写有什么区别?假如没有编写线程信号处理函数,默认的动作是什么样的,其不同系统上表现是否一致?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
16 [报告]
发表于 2013-10-23 11:25 |只看该作者
这辈子我都用不到cancel, 楼主参考一下吧.

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
17 [报告]
发表于 2013-10-23 11:37 |只看该作者
回复 16# linux_c_py_php


    你确定?测试代码也从来没用过pthread_cancel么?

论坛徽章:
5
双鱼座
日期:2013-11-26 17:56:26狮子座
日期:2013-11-29 15:41:32处女座
日期:2014-02-21 11:59:07技术图书徽章
日期:2014-03-06 15:33:53技术图书徽章
日期:2014-03-06 15:39:30
18 [报告]
发表于 2013-10-23 12:10 |只看该作者
回复 15# fly3ds


    多谢提醒,我有空测试下看看兼容性,对于我来说:重要的是制造问题而不是解决问题

论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00
19 [报告]
发表于 2013-10-23 12:16 |只看该作者
回复 17# w_anthony


我猜我这辈子可能也用不上了       以前到底用没用过我还真忘了     不过我还是鼓励你们多用用写点文章  我们看看 假如看出感觉了 再用用不迟 -_-

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
20 [报告]
发表于 2013-10-23 16:31 |只看该作者
有兴趣可以看一下我的网络库是怎么完成多线程设计的:

https://code.csdn.net/qq120848369/ez_poll
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP