struct pthread\u rwlock\t成员的说明

struct pthread\u rwlock\t成员的说明,c,synchronization,pthreads,glibc,C,Synchronization,Pthreads,Glibc,有人能总结一下pthread\u 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 __wri

有人能总结一下pthread\u 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}
{uuuuu数据={
__锁=2,
__nr_读卡器=24644,
__readers_wakeup=28432136,
__writer_wakeup=24644,
__nr_读取器_排队=0,
__nr_写入程序_排队=0,
__writer=0,
__共享=0,
__pad1=0,pad2=0,
__标志=0},
__size=“\002\000\000\000D`\000\000\bױ\001D`”,“\000”,
__align=105845174042626}
线程在试图获取读锁时被阻塞。锁的结构看起来正常吗


操作系统是CentOS 7.6,带有glibc-2.17-260.el7_6.3.x86_64。

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

如果您确切地告诉我们您使用的是哪个Linux发行版,它的年代,以及运行
/lib/libc.so.6
时的输出是什么(如果该文件不存在,请在
/lib
/lib64
的子目录中查找),我们可能会更有帮助


还值得尝试将您的程序转移到较新的Linux发行版上,看看您是否仍然可以重现这个问题。然后您可以自己使用gdb扩展。

您不应该关心成员(除非您将其用作如何编写自己的rwlock的示例)。只需将它与适当的函数一起使用,并将其视为一个黑匣子。@Shawn OP说他们正在尝试调试死锁;在这种情况下,这是一个合理的问题。
pthread\u rwlock\t
类型是标准化的,但其成员似乎不是。毫无疑问,有人知道他们的意思,但我们大多数人只能根据他们的名字猜测,或者需要研究实现。@zwol OP需要发布一个演示死锁的帖子,以获得帮助。我自己正要建议一个MCVE,但主要是从创建一个作为调试方法的练习的角度来看。当然,一旦一个MCVE在手,如果OP还不清楚这个问题,那么它将成为这个或另一个SO问题的良好基础。FWIW,OP呈现的
pthread_lock_t
成员与glibc 2.17中定义的x86_64的结构相匹配(可能还有附近的一些其他版本)。v2.17是由RHEL 7版本的发行版提供的glibc版本,但我敢肯定还有其他版本。@zwol rpm-q glibc glibc-2.17-260.el7_6.3.x86_64 cat/etc/redhat release CentOS Linux release 7.6.1810(Core)@JohnBollinger,你知道锁=2代表什么吗?不,ashish,我不知道glibc pthreads实现的细节。我只知道如何查找和阅读标题。@JohnBollinger是的,我确实试过阅读标题。“#2 0 0>0 0 0个读卡器已获得锁。”但这似乎存储在u读卡器中,而不是在u锁中。无论如何,我会继续检查。。