【发布时间】:2012-07-08 15:14:01
【问题描述】:
我有一个在 Linux 上运行的多线程程序,有时如果我对它运行 gstack,有一个线程等待锁定很长时间(比如 2-3 分钟),
线程 2(线程 0x5e502b90 (LWP 19853)):
0 0x40000410 in __kernel_vsyscall()
1 0x400157b9 in __lll_lock_wait () from /lib/i686/nosegneg/libpthread.so.0
2 0x40010e1d in _L_lock_981 () from /lib/i686/nosegneg/libpthread.so.0
3 0x40010d3b in pthread_mutex_lock () from /lib/i686/nosegneg/libpthread.so.0
...
我检查了其余线程,没有一个线程获得了这个锁,但是,过了一会儿,这个线程 (LWP 19853) 可以成功地获得这个锁。
应该有一个线程已经获得了这个锁,但是我没找到,有什么遗漏的吗?
编辑: pthread_mutex_t的定义:
typedef 联合
{
结构 __pthread_mutex_s {
int __lock;
unsigned int __count;
int __owner;
/* KIND 必须停留在结构中的这个位置以保持 二进制兼容性。 */
int __kind;
无符号整数 __nuers;
扩展联合 { int __spins; __pthread_slist_t __list; };
} __data;
字符_大小[_SIZEOF_PTHREAD_MUTEX_T];
long int __align;
} pthread_mutex_t;
有一个成员“__owner”,它是现在持有互斥锁的线程的id。
【问题讨论】:
-
不是写在输出上面吗?
Thread 2 -
线程 2 正在等待锁。我想找到现在持有锁的线程,但是失败了。
-
Is it possible to determine the thread holding a mutex? 的可能重复项 - 那里接受的答案应该对您有所帮助。