- 论坛徽章:
- 0
|
只说一下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给我发过消息问这个问题。。 |
|