有人可以总结一下pthread_rwlock_t中不同成员的含义吗?
struct
{
int __lock;
unsigned int __nr_readers;
unsigned int __readers_wakeup;
unsigned int __writer_wakeup;
unsigned int __nr_readers_queued;
unsigned int __nr_writers_queued;
int __writer;
int __shared;
unsigned long int __pad1;
unsigned long int __pad2;
/* FLAGS must stay at this position in the structure to maintain
binary compatibility. */
unsigned int __flags;
} __data;
我正在调试一个死锁,其锁状态如下:
{__data = {
__lock = 2,
__nr_readers = 24644,
__readers_wakeup = 28432136,
__writer_wakeup = 24644,
__nr_readers_queued = 0,
__nr_writers_queued = 0,
__writer = 0,
__shared = 0,
__pad1 = 0, __pad2 = 0,
__flags = 0},
__size = "\002\000\000\000D`\000\000\bױ\001D`", '\000' <repeats 41 times>,
__align = 105845174042626}
并且该线程在尝试获取对其的读取锁定时被阻塞。锁结构看起来不错吗?
操作系统是CentOS 7.6,带有glibc-2.17-260.el7_6.3.x86_64。
答案 0 :(得分:0)
当前版本的GNU libc(2.25版及更高版本)附带gdb扩展名,这些扩展名将解码各种pthread结构的成员,包括pthread_rwlock_t
。但是,查看此扩展的代码,它期望pthread_rwlock_t
的内容与您显示的内容完全不同,因此,将其手动应用于数据转储将毫无用处。出于同样的原因,我无法告诉您这些字段的含义。
如果您确切地告诉我们所使用的Linux发行版,使用年限以及像运行程序一样运行/lib/libc.so.6
的输出是什么(如果该文件不存在,请在子目录中查找它。 /lib
和/lib64
)中,我们可能会更有帮助。
尝试将程序转移到较新的Linux发行版上,看看是否仍然可以重现该问题,也是值得的。然后,您可以自己使用gdb扩展名。