假设共享的 POSIX 互斥锁已经初始化(使用 PTHREAD_PROCESS_SHARED)。
然后,考虑以下过程:
typedef struct {
pthread_mutex_t mutex;
// ...
} Shared;
Shared *shared = (Shared *)mmap(...); // MAP
pthread_mutex_lock(&shared->mutex); // LOCK
// REMAP
munmap(shared, ...);
shared = (Shared *)mmap(...);
pthread_mutex_unlock(&shared->mutex); // UNLOCK
POSIX 是否保证这将按照“天真”的意图工作?
据我所知,没有一个相关的手册页提到这种情况。
另外,以下特定于 Linux 的替代方案怎么样:
Shared *shared = (Shared *)mmap(...); // MAP
pthread_mutex_lock(&shared->mutex); // LOCK
shared = (Shared *)mremap(shared, ...); // MREMAP_MAYMOVE
pthread_mutex_unlock(&shared->mutex); // UNLOCK
例如,我可以想象一个 PTHREADS 实现,它将存储一个指向进程内某处锁定互斥锁的指针。如果互斥锁被配置为健壮的 (PTHREAD_MUTEX_ROBUST),如果进程在互斥锁被锁定时死亡,则它允许实现将互斥锁标记为“已放弃”。
我不知道这样的方案是否真的有效,它是否被 POSIX 允许,或者互斥锁的健壮性是如何在任何平台上实际实现的,但是如果按照这些方式实现 会 工作,和 会 根据 POSIX 是有效的,那么上面的重新映射场景将具有未定义的行为。
最佳答案
不!
正如@Celada 所指出的,Linux 中健壮互斥锁的实现假设锁定的健壮互斥锁保留在固定地址:
http://www.kernel.org/doc/Documentation/robust-futexes.txt
由此我们可以肯定地得出结论,POSIX 允许实现 禁止重新映射 锁定的互斥锁。否则 Linux 实现将是不正确的。
因此,我在问题中概述的程序应视为不正确 ,并导致未定义的行为。
关于pthreads - 我可以在共享的 POSIX 互斥锁被锁定时重新映射它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15109349/