【发布时间】: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_ttype 是标准化的,但它的成员似乎不是。毫无疑问,有人知道他们的意思,但我们大多数人只能根据他们的名字猜测,或者需要研究实现。 -
@zwol OP 需要发布一个 minimal reproducible example 来演示死锁以获得帮助。
-
我正打算自己建议一个 MCVE,但主要是从创建一个用作调试方法的练习的角度来看。当然,一旦有了 MCVE,如果 OP 还没有弄清楚这个问题,那么它将作为这个或另一个 SO 问题的良好基础。
标签: c synchronization pthreads glibc