可以有人总结一下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。
pthread_rwlock_t
类型已经标准化,但其成员似乎并没有。毫无疑问,有人知道它们的含义,但大多数人只能根据名称猜测,或者需要研究实现才能理解。 - John Bollinger__writer_wakeup
成员具有相同的值这一事实可以被视为内部一致性的迹象(甚至更加推测性)。为什么这样的状态会导致线程在获取读锁时阻塞对我来说是不透明的,但如果确实持有那么多次读锁,那本身就非常可疑。当然,如果读锁甚至被持有一次,那将阻止获取写锁。 - John Bollinger