免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9477 | 回复: 8

[函数] 我用pthread_kill使用怎么就导致Segmentation fault呢? [复制链接]

论坛徽章:
0
发表于 2012-09-04 15:36 |显示全部楼层
本帖最后由 herocsz 于 2012-09-05 08:44 编辑

我是这样做的:在开启线程之前,检测线程是否已经启动,如果启动则退出。
代码是这样写的:

pthread_t threadId;

int sampleStart(void)
{
   int kill_ret;

   kill_ret = pthread_kill(threadId, 0);
   if(ESRCH == kill_ret) //线程不存在
   {
      //创建线程
   }
   else
   {
     //线程已经存在或操作异常,退出。
   }
}

经过调试,发现当程序执行到ret = kill_ret = pthread_kill(threadId, 0);时,程序会死掉,跳出Segmentation fault。
这是怎么回事?

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2012-09-04 16:29 |显示全部楼层
经过调试,发现当程序执行到ret = kill_ret = pthread_kill(threadId, 0);时,程序会死掉
----这个结论怎么判断的?if else里的代码可以也贴下不?

论坛徽章:
0
发表于 2012-09-04 19:18 |显示全部楼层

论坛徽章:
0
发表于 2012-09-05 08:46 |显示全部楼层
cokeboL 发表于 2012-09-04 16:29
经过调试,发现当程序执行到ret = kill_ret = pthread_kill(threadId, 0);时,程序会死掉
----这个结论怎么 ...


kill_ret的结果是根据pthread_kill函数的返回值来判定的。
成功:0
线程不存在:ESRCH
信号不合法:EINVAL

if else里的代码就是创建线程,和return,没有什么。

论坛徽章:
0
发表于 2012-09-05 08:56 |显示全部楼层
本帖最后由 herocsz 于 2012-09-05 09:01 编辑
younghuster 发表于 2012-09-04 19:18
网上搜的,试试这个:http://stackoverflow.com/questio ... -caused-by-pthread- ...


这篇文章对我有用,非常感谢:wink:

文章里说了一个pthread_tryjoin_np函数,拿来用用看,是否满足要求。
不过文章里又说自己建立一个追踪线程ID的流程,也是一个方法,但这个方法对于我目前的应用来说,不是一个很好的解决方案。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2012-09-05 09:24 |显示全部楼层
回复 4# herocsz


    我是问,楼主怎么判断的程序运行到pthread_kill死掉了?如果有返回值,那就是在运行完pthread_kill之后死的,楼主都没搞清楚是在哪里死掉的。

我觉得我问得够明白的了,为什么老被别人看不懂。。。另外,代码不贴全,说句不好听的,你们那代码没什么稀罕的,贴出来也没谁当宝贝,只是帮

你定位问题,Segmentation fault在我看来跟你那个pthread_kill 关系不大。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2012-09-05 09:31 |显示全部楼层
比如创建线程的时候,你参数怎么写的?如果pthread_create(),你第一个参数怎么传的?是直接 threadId 还是取地址 &threadId?如果是 threadId,那你这个全局的未初始化,编译器把threadId初始化为0,这样你把0作为指针传给 pthread_create()就段错误了。这是一种可能。你不贴代码,谁知道你哪里的段错误啊。。。

论坛徽章:
0
发表于 2012-09-11 15:28 |显示全部楼层
楼主你的threadId值有问题。可能的情况
(1)调用pthread_create创建线程的时候,是否传的threadId的地址?
(2)在调用pthread_kill的时候,threadId的值还有效吗?

楼主segment fault一般都是内存问题,且楼主程序的代码不多,可以查的。

ps:技术无限,欢迎交流

论坛徽章:
0
发表于 2012-12-03 22:30 |显示全部楼层
请问你的 pthread_kill(threadId, 0);时,程序会死掉,跳出Segmentation fault是什么问题,怎么解决的,我也出现了,纠结了好几天了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP