我有一个场景,共享内存区域由两个不同的进程独占访问。当我启动进程时,第一个进程成功锁定互斥锁,更新内存并解锁互斥锁。但是我观察到,当第二个进程尝试锁定它时,它仍然处于死锁状态,等待互斥锁解锁。
第一个进程和第二个进程的互斥锁时间差为 10 秒。
我正在使用 std::mutex。请告诉我我错过了什么。
我有一个场景,共享内存区域由两个不同的进程独占访问。当我启动进程时,第一个进程成功锁定互斥锁,更新内存并解锁互斥锁。但是我观察到,当第二个进程尝试锁定它时,它仍然处于死锁状态,等待互斥锁解锁。
第一个进程和第二个进程的互斥锁时间差为 10 秒。
我正在使用 std::mutex。请告诉我我错过了什么。
尽管其他人对文档进行了引用,但当在 Linux 上的共享内存中使用时,这些类std::mutex
和std::shared_mutex
实际上确实跨进程工作。我检查了 GCC 8.3.1 和 Clang 6.0.1。
这些在 Linux 上的标准 C++ 实现使用 pthreads。pthreads 提供PTHREAD_PROCESS_SHARED
和PTHREAD_PROCESS_PRIVATE
作为 和 的属性pthread_mutex_t
被pthread_rwlock_t
抽象出来并默认为std::mutex
和std::shared_mutex
。尽管 POSIX 文档说默认值为 PRIVATE,但在共享内存中分配的 apthread_mutex_t
和pthread_rwlock_t
在锁定时会阻塞竞争进程。这是因为 Linux 上 pthread 的实际实现使用 futexes,并且它们旨在用于共享内存,即使在映射地址可能因进程而异的情况下也是如此。
考虑到使用 futex 实现互斥锁的策略,PTHREADS_PROCESS_PRIVATE 行为实际上可能更难以实现,因此,它没有被默默地实现。
如果您确实希望您的互斥锁是进程私有的,请避免将它们放在共享内存中。另一方面,如果您确实想分享它们,请注意这种标准差异可能会发生变化。
为了可靠性,请使用Boost Interprocess。
std::mutex 实例仅作用于单个进程;它不能进行进程间同步/并发。它只能同步父进程中的子线程。
改用 Boost 或进程间同步库。
std::mutex 不支持进程间操作,但 pthread 库具有可以使用的进程间互斥锁。这里的例子。