我可以在锁定时重新映射共享的POSIX互斥锁吗?

时间:2013-02-27 10:10:27

标签: pthreads posix mutex mmap remap

假设已经初始化了共享的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,有效,那么上面的重映射方案会有不确定的行为。

1 个答案:

答案 0 :(得分:2)

没有!

正如@Celada所指出的,Linux中强大的互斥锁的实现假设一个锁定的健壮的互斥锁保持固定的地址:

http://www.kernel.org/doc/Documentation/robust-futexes.txt

由此我们可以肯定地得出结论,POSIX允许实现禁止重新映射锁定的互斥锁。否则Linux实现将是不正确的。

问题,我在问题中概述的程序应被视为不正确,并导致未定义的行为。