pthread_rwlock_t 结构体成员说明

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


@Shawn OP说他们正在尝试调试死锁;在这种情况下,这是一个合理的问题。 - zwol
1
pthread_rwlock_t 类型已经标准化,但其成员似乎并没有。毫无疑问,有人知道它们的含义,但大多数人只能根据名称猜测,或者需要研究实现才能理解。 - John Bollinger
我本来想建议一个MCVE,但主要是从创建一个作为调试方法的角度考虑。当然,一旦有了MCVE,如果问题对OP还不清楚,那么它将成为这个或其他SO问题的良好基础。 - John Bollinger
@Shawn 如果成员能够给我一些线索,说明出了什么问题怎么办?实际上,我担心锁结构被破坏的情况。如果没有关于结构成员的一些想法,我将无法意识到是否真的存在破坏。 - ashish
如果我根据成员名称进行猜测,我会猜测锁定数据描述了一个状态,在该状态下读锁定被持有24644次(可能由较少的不同线程持有)。__writer_wakeup成员具有相同的值这一事实可以被视为内部一致性的迹象(甚至更加推测性)。为什么这样的状态会导致线程在获取锁时阻塞对我来说是不透明的,但如果确实持有那么多次读锁,那本身就非常可疑。当然,如果读锁甚至被持有一次,那将阻止获取锁。 - John Bollinger
显示剩余4条评论
1个回答

0

当前版本的GNU libc(2.25及更高版本)附带了gdb扩展,可以解码各种pthread结构的成员,包括pthread_rwlock_t。然而,查看此扩展的代码,它期望pthread_rwlock_t的内容与您所显示的内容非常不同,因此手动将其应用于您的数据转储将毫无用处。出于同样的原因,我无法告诉您这些字段的含义。

如果您告诉我们您使用的Linux发行版、其年龄以及运行/lib/libc.so.6的输出(如果该文件不存在,请在/lib/lib64的子目录中查找),我们可能会更有帮助。

还值得尝试将您的程序移至更新的Linux发行版,并查看是否仍然可以重现问题。然后您就可以自己使用gdb扩展。


就此而言,OP提供的pthread_lock_t成员与glibc 2.17在x86_64上定义的结构匹配(以及在该范围内的某些其他版本)。v2.17是RHEL 7发行版提供的glibc版本,但我相信也被其他各种发行版所采用。 - John Bollinger
@zwol rpm -q glibc glibc-2.17-260.el7_6.3.x86_64 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) - ashish
@JohnBollinger,你知道__lock = 2代表什么吗? - ashish
1
不,@ashish,我不是那些了解glibc pthreads实现细节的人之一。我只知道如何查找和阅读头文件。 - John Bollinger
@JohnBollinger,是的,我确实尝试阅读了标题。https://code.woboq.org/userspace/glibc/nptl/pthread_rwlock_common.c.html#__pthread_rwlock_wrlock_full。"#2 0 0 >0 0 读者已经获得了锁定。"但似乎这存储在__readers而不是__lock中。无论如何,我会继续检查... - ashish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接