免费注册 查看新帖 |

Chinaunix

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

[进程管理] pthread_mutex_lock故障 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-02-28 13:06 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
12 [报告]
发表于 2013-03-01 14:06 |只看该作者
本帖最后由 tqyou85 于 2013-03-01 14:16 编辑
chenyu105 发表于 2013-02-27 21:48
只说一下gdb的结果,

__count值表示信号量的嵌套加锁次数   =1
__owner表示信号量的拥有者             = 701
__nusers表示信号量加锁成功的线程数 =1649

__lock由2部分组成,bit 31~28表示flag,目前c库中只使用了bit31和bit30,bit31为1时表示
当前互斥锁有1个以上的线程(或进程)在等待获取该锁(FUTEX_WAITERS),bit30 为1时表示锁的拥有者已经退
出(FUTEX_OWNER_DIED); Bit 27~0表示加锁者的线程id

__lock   = 0x800002ce bit31为1,bit0-bit27是线程id,这里是718
这里和__owner字段对不上

我这边看到glibc版本, 如果发现线程加锁成功后,lock字段里的线程号和owner对不上,是会打印告警的
并且进到你gdb出来的那个什么pause函数里。
        if ((mutex->__data.__kind & PTHREAD_MUTEX_PRIO_INHERIT_NP) && (mutex->__data.__owner != (mutex->__data.__lock & FUTEX_TID_MASK)))
        {
                fprintf(stderr,"FUNC: %s; LINE: %d; mutex lock not equal owner: thread ID is %d, mutex addr is 0x%p, __lock is %d, __owner is %d, __count is %d, __nusers is %d, __kind is %d\n",
                                                                __FUNCTION__, __LINE__, id, mutex, mutex->__data.__lock, mutex->__data.__owner, mutex->__data.__count, mutex->__data.__nusers, mutex->__data.__kind
                                                                );
                while (1)
                                pause_not_cancel ();
        }

现在有点怀疑是内核futex处理的问题了。。
你的内核版本是多少

你是不是也在csdn的blog给我发过消息问这个问题。。


分析的有道理,__owner和__lock中的线程号对不上,这个我也注意到了,原因一直整不明白。
没有在csdn上发过消息,大虾不知有何思路没?
内核版本:2.6.34.12,并且打了内核实时性patch
powerpc平台


   

论坛徽章:
0
13 [报告]
发表于 2013-03-01 14:07 |只看该作者
回复 11# stephen_du
我的是PPC平台,这个问题是偶现的。进程间锁应该是生效的。

   

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
14 [报告]
发表于 2013-03-16 22:26 |只看该作者
回复 1# tqyou85


    问题有没有再现? 解决了没有?

论坛徽章:
0
15 [报告]
发表于 2013-03-18 16:18 |只看该作者
回复 14# linuxfellow
很难复现,未解决

   

论坛徽章:
0
16 [报告]
发表于 2013-05-10 16:51 |只看该作者
不知道你这个后来有没有规避,我们之前有同事发现内核futex对key的计算, 如果是hugetlb所在的vma,算出来的key有问题,可能跟你这个问题相关。
已经在跟内核社区交涉了

http://marc.info/?l=linux-kernel&m=136793065912394&w=2

论坛徽章:
0
17 [报告]
发表于 2013-05-13 11:12 |只看该作者
chenyu105 发表于 2013-05-10 16:51
不知道你这个后来有没有规避,我们之前有同事发现内核futex对key的计算, 如果是hugetlb所在的vma,算出来的 ...


多谢大侠提供帮助,我们去掉HUGETLB属性之后,mutex暂时没有出现异常。不过原因我还是不明确,因为我们mutex的地址相差n*3608 Bytes,不是PAGE_SIZE的整数倍。

论坛徽章:
0
18 [报告]
发表于 2013-08-30 14:30 |只看该作者
我也碰到过类似的问题,不过只是同一进程内的线程访问,去掉HUGETLB能解决了

tqyou85 发表于 2013-05-13 11:12
多谢大侠提供帮助,我们去掉HUGETLB属性之后,mutex暂时没有出现异常。不过原因我还是不明确,因为我们 ...

论坛徽章:
0
19 [报告]
发表于 2013-08-30 14:32 |只看该作者
打错了,应该是:
我也碰到过类似的问题,不过只是同一进程内的线程访问,去掉HUGETLB能解决吗
cxm240 发表于 2013-08-30 14:30
我也碰到过类似的问题,不过只是同一进程内的线程访问,去掉HUGETLB能解决了

论坛徽章:
0
20 [报告]
发表于 2013-08-30 17:02 |只看该作者
回复 19# cxm240

去掉HUGETLB可以解决问题,还有一种方法,就是按照16楼的方法修改内核

http://marc.info/?l=linux-kernel&m=136793065912394&w=2


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP