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

标签 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 是有效的,那么上面的重新映射场景将具有未定义的行为。

最佳答案

不!

正如@Celada 所指出的,Linux 中健壮互斥锁的实现假设锁定的健壮互斥锁保留在固定地址:

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

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

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

关于pthreads - 我可以在共享的 POSIX 互斥锁被锁定时重新映射它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15109349/

相关文章:

c - 我怎样才能知道类 unix 操作系统是否实现了 POSIX 信号量?

c++ - C++11 的 std::thread 与 POSIX 信号量兼容吗?

c - 为什么 pthread_join() 从未被调用?

c - linux在c中跨线程连接到相同的sockaddr

c++ - 如何在Vxworks中正确运行Clock-gettime获取准确时间

c++ - 场景 : Global variables in DLL which is used by Multi-threaded Application

线程可以修改 pthread_create 参数吗?

c - C-在其中一个用条件变量向主线程发出信号后,如何终止所有线程?

c++ - C++ 队列中读/写操作的排序

没有互斥量的条件等待