6

我有一个场景,共享内存区域由两个不同的进程独占访问。当我启动进程时,第一个进程成功锁定互斥锁,更新内存并解锁互斥锁。但是我观察到,当第二个进程尝试锁定它时,它仍然处于死锁状态,等待互斥锁解锁。

第一个进程和第二个进程的互斥锁时间差为 10 秒。

我正在使用 std::mutex。请告诉我我错过了什么。

4

3 回答 3

8

尽管其他人对文档进行了引用,但当在 Linux 上的共享内存中使用时,这些类std::mutexstd::shared_mutex 实际上确实跨进程工作。我检查了 GCC 8.3.1 和 Clang 6.0.1。

这些在 Linux 上的标准 C++ 实现使用 pthreads。pthreads 提供PTHREAD_PROCESS_SHAREDPTHREAD_PROCESS_PRIVATE作为 和 的属性pthread_mutex_tpthread_rwlock_t抽象出来并默认为std::mutexstd::shared_mutex。尽管 POSIX 文档说默认值为 PRIVATE,但在共享内存中分配的 apthread_mutex_tpthread_rwlock_t在锁定时会阻塞竞争进程。这是因为 Linux 上 pthread 的实际实现使用 futexes,并且它们旨在用于共享内存,即使在映射地址可能因进程而异的情况下也是如此。

考虑到使用 futex 实现互斥锁的策略,PTHREADS_PROCESS_PRIVATE 行为实际上可能更难以实现,因此,它没有被默默地实现。

如果您确实希望您的互斥锁是进程私有的,请避免将它们放在共享内存中。另一方面,如果您确实想分享它们,请注意这种标准差异可能会发生变化。

为了可靠性,请使用Boost Interprocess

于 2019-07-25T22:15:58.603 回答
6

std::mutex 实例仅作用于单个进程;它不能进行进程间同步/并发。它只能同步父进程中的子线程。

改用 Boost 或进程间同步库。

于 2017-10-10T11:17:34.283 回答
1

std::mutex 不支持进程间操作,但 pthread 库具有可以使用的进程间互斥锁。这里的例子。

于 2017-10-10T13:34:35.827 回答