【发布时间】:2021-03-21 15:50:19
【问题描述】:
我正在研究pthread_rwlock_t 的不同实现版本。
-
GLIBC2.30
typedef union { struct __pthread_rwlock_arch_t __data; char __size[__SIZEOF_PTHREAD_RWLOCK_T]; long int __align; } pthread_rwlock_t; struct __pthread_rwlock_arch_t { unsigned int __readers; unsigned int __writers; unsigned int __wrphase_futex; unsigned int __writers_futex; unsigned int __pad3; unsigned int __pad4; ... -
GLIBC2.17
typedef union { # ifdef __x86_64__ 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; ... } pthread_rwlock_t;
他们的实现似乎不同,给我带来了一些困难。因为我有一个链接到 GLIBC2.30 的程序 a 和一个链接到 GLIBC2.17 的程序 b。这两个程序都将在 shm 上共享的同一 pthread_rwlock_t 上运行。我通过静态链接 GLIBC 实现了这一点。
但是,GLIBC2.30 和 GLIBC2.17 会以不同的方式解释 shm 上的 pthread_rwlock_t 对象,因为它们的定义不同。例如,如果 __readers 被 GLIBC2.30 设置为 2,然后被 GLIBC2.17 访问,它会认为 pthread_rwlock_t 被锁定并休眠。但是,pthread_rwlock_t 未锁定。
我的问题是:
- 为什么
pthread_rwlock_t在版本之间变化如此之大?是因为它想支持更多功能,还是想提高性能? - 有什么方法可以让 GLIBC2.30 和 GLIBC2.17 运行相同的 rwlock?
更新
我查看了更多源代码,发现:
- GLIBC2.17使用
lll_lock实现 - GLIBC2.30 使用原子操作哟实现
那我还有一个问题,不同版本的 GLIBC 是不是不能相互压缩?所以我不能在不同版本的 GLIBC 之间使用 shm?
【问题讨论】:
-
I achieved this by staticly linking GLIBC那么你为什么在乎呢?For example, if __readers is set to 2你是访问pthread_rwlock_t类型的内部结构还是使用onlypthread_rwlock_*访问器? (即使你确实使用了,你也静态链接了 glibc。所以.. 你为什么在乎?) -
1.不同的 GLIBC 链接程序将在同一个 shm 上运行,这会导致问题,所以我很在意。 2.调用
pthread_rwlock_wrlock时,会设置__readers或__lock -
两个glibc链接程序之间的通信仍然是由内核完成的,而不是glibc。
-
我通过静态链接 GLIBC 实现了这一点。 这个问题提供了一个完美的例子来说明为什么不静态链接 GLIBC。
-
完全是 GLIBC 问题,与内核无关 不,这是你的问题。您决定将需要在二进制级别交互的两个程序静态链接到两个不同版本的 GLIBC。你:“医生,我这样做的时候很痛。”医生:“不要那样做。”