共享内存中的std :: mutex无法正常工作

kle*_*kle 1 c++ multithreading mutex shared-memory stdmutex

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

对于第一个和第二个进程,互斥锁之间的时间差为10秒.

我使用的是std :: mutex.请告诉我我错过了什么.

Cha*_*alk 6

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

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

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

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

为了可靠性,请使用Boost Interprocess


小智 5

std :: mutex实例仅限于单个进程; 它不能进行进程间同步/并发.它只能在父进程内同步子线程.

请改用Boost或进程间同步库.