【问题标题】:Description of the members of struct pthread_rwlock_tstruct pthread_rwlock_t 的成员说明
【发布时间】:2019-09-07 17:04:16
【问题描述】:

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

【问题讨论】:

  • 您不应该关心成员(除非您将其用作如何编写自己的 rwlock 的示例)。只需将其与适当的功能一起使用,并将其视为黑匣子。
  • @Shawn OP 说他们正在尝试调试死锁;在这种情况下,这是一个合理的问题。
  • pthread_rwlock_t type 是标准化的,但它的成员似乎不是。毫无疑问,有人知道他们的意思,但我们大多数人只能根据他们的名字猜测,或者需要研究实现。
  • @zwol OP 需要发布一个 minimal reproducible example 来演示死锁以获得帮助。
  • 我正打算自己建议一个 MCVE,但主要是从创建一个用作调试方法的练习的角度来看。当然,一旦有了 MCVE,如果 OP 还没有弄清楚这个问题,那么它将作为这个或另一个 SO 问题的良好基础。

标签: c synchronization pthreads glibc


【解决方案1】:

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

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

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

【讨论】:

  • 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 万一你知道 __lock = 2 代表什么?
  • 不,@ashish,我不属于那些了解 glibc pthreads 实现细节的人。我只知道如何查找和阅读标题。
  • @JohnBollinger 是的,我确实尝试阅读标题。 code.woboq.org/userspace/glibc/nptl/…。 “#2 0 0 >0 0 读者已获得锁。”但似乎这存储在 __readers 中而不是 __lock 中。无论如何,将继续检查..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2020-04-03
  • 2015-03-19
  • 2023-03-16
  • 2012-03-08
  • 1970-01-01
相关资源
最近更新 更多