c - 是否可以确定持有互斥锁的线程?

标签 c linux multithreading pthreads mutex

首先,我使用 pthread 库来编写多线程 C 程序。线程总是被等待的互斥锁挂起。当我使用 strace 实用程序查找处于 FUTEX_WAIT 状态的线程时,我想知道当时哪个线程持有该互斥锁。但我不知道我该怎么做。是否有任何实用程序可以做到这一点?

有人告诉我Java虚拟机支持这个,所以我想知道Linux是否支持这个功能。

最佳答案

您可以使用互斥体内部知识来执行此操作。通常这不是一个好主意,但它可以用于调试。

在具有 pthreads 的 NPTL 实现的 Linux 下(任何现代 glibc),您可以检查 pthread_mutex_t 结构的 __data.__owner 成员以找出线程目前已将其锁定。这是使用 gdb 附加到进程后的操作方法:

(gdb) thread 2
[Switching to thread 2 (Thread 0xb6d94b90 (LWP 22026))]#0  0xb771f424 in __kernel_vsyscall ()
(gdb) bt
#0  0xb771f424 in __kernel_vsyscall ()
#1  0xb76fec99 in __lll_lock_wait () from /lib/i686/cmov/libpthread.so.0
#2  0xb76fa0c4 in _L_lock_89 () from /lib/i686/cmov/libpthread.so.0
#3  0xb76f99f2 in pthread_mutex_lock () from /lib/i686/cmov/libpthread.so.0
#4  0x080484a6 in thread (x=0x0) at mutex_owner.c:8
#5  0xb76f84c0 in start_thread () from /lib/i686/cmov/libpthread.so.0
#6  0xb767784e in clone () from /lib/i686/cmov/libc.so.6
(gdb) up 4
#4  0x080484a6 in thread (x=0x0) at mutex_owner.c:8
8               pthread_mutex_lock(&mutex);
(gdb) print mutex.__data.__owner
$1 = 22025
(gdb)

(我切换到挂起的线程;执行回溯以找到它卡住的 pthread_mutex_lock();更改堆栈帧以找出它试图锁定的互斥锁的名称;然后打印该互斥体的所有者)。这告诉我,LWP ID 为 22025 的线程是罪魁祸首。

然后您可以使用 thread find 22025 找出该线程的 gdb 线程号并切换到它。

关于c - 是否可以确定持有互斥锁的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3483094/

相关文章:

objective-c - 为什么此 C 代码中的结构有两个名称?

java - 重复的 Java 进程卡在 GNU/Linux 服务器的单个用户上

并行的linux批处理作业

multithreading - 使线程使用中央数据库连接的正确方法

c# - 将 Foreach 分成线程示例

我可以在自己的C程序中捕获Linux程序执行的系统调用吗?

c - C中的数组排序

c - 尝试读取我知道存在且正常但无法打开的文件

linux - 可以运行同一可执行文件的多个实例吗?

java - Tomcat Java 错误