struct pthread_rwlock_t成员的描述

问题描述 投票:2回答:1

有人可以总结一下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。

c synchronization pthreads glibc
1个回答
0
投票

当前版本的GNU libc(版本2.25及更高版本)提供了gdb扩展,它将解码各种pthread结构的成员,包括pthread_rwlock_t。但是,查看此扩展的代码,它期望pthread_rwlock_t的内容与您显示的内容完全不同,因此手动将其应用于数据转储将毫无用处。出于同样的原因,我不能告诉你这些字段是什么意思。

如果你确切地告诉我们你正在使用哪个Linux发行版,它的年龄,以及运行/lib/libc.so.6的输出是什么,就像它是一个程序一样(如果那个文件不存在,在/lib/lib64的子目录中查找),我们可能会更有帮助。

尝试将程序移动到较新的Linux发行版并查看是否仍可以重现该问题也是值得的。然后你可以自己使用gdb扩展。

© www.soinside.com 2019 - 2024. All rights reserved.