- 论坛徽章:
- 0
|
本帖最后由 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平台
|
|