我有一个在 Linux 上运行的多线程程序,有时如果我对它运行 gstack,有一个线程等待锁定很长时间(比如 2-3 分钟),
线程 2(线程 0x5e502b90 (LWP 19853)):
0 0x40000410 在 __kernel_vsyscall ()
1 来自 /lib/i686/nosegneg/libpthread.so.0 的 __lll_lock_wait () 中的 0x400157b9
2 0x40010e1d in _L_lock_981 () from /lib/i686/nosegneg/libpthread.so.0
3 0x40010d3b 在来自 /lib/i686/nosegneg/libpthread.so.0 的 pthread_mutex_lock ()
...
我检查了其余的线程,它们都没有获得这个锁,但是,过了一会儿,这个线程(LWP 19853)可以成功地获得这个锁。
应该有一个线程已经获得了这个锁,但是我没有找到它,我错过了什么吗?
编辑: pthread_mutex_t 的定义:
类型定义联合
{
结构 __pthread_mutex_s {
int __lock;
无符号整数__count;
int __owner;
/* KIND 必须保持在结构中的这个位置以保持二进制兼容性。*/
int __kind;
无符号整数 __nuers;
扩展联合 { int __spins; __pthread_slist_t __list; };
} __数据;
字符_大小[ _SIZEOF_PTHREAD_MUTEX_T];
长整数 __align;
} pthread_mutex_t;
有一个成员“__owner”,它是现在持有互斥锁的线程的id。