繁体   English   中英

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

[英]std::mutex in shared memory not working

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

互斥锁之间的时间差在第一个和第二个过程中为10s。

我正在使用std :: mutex。 请告诉我我所缺少的。

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

看起来可以使用Boost或进程间同步库。

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

尽管有人引用了文档,但在Linux上的共享内存中使用std::mutexstd::shared_mutex 实际上可以跨进程工作 我已经检查了GCC 8.3.1和Clang 6.0.1。

这些在Linux上的标准C ++实现使用pthreads。 std::mutexstd::shared_mutex提取并默认使用PTHREAD_PROCESS_SHAREDPTHREAD_PROCESS_PRIVATE的pthread作为pthread_mutex_tpthread_rwlock_t属性。 即使POSIX文档说默认值是PRIVATE,在共享内存中分配的pthread_mutex_tpthread_rwlock_t在锁定时也会阻塞竞争的进程。 这是因为pthread在Linux上的实际实现使用futex ,并且即使在映射地址可能在各个进程之间不同的情况下,它们也打算用于共享内存中。

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

如果确实希望互斥锁是进程专用的,则只需避免将它们放在共享内存中。 另一方面,如果您确实希望共享它们,则请注意,此标准差异可能会有所更改。

为了提高可靠性,请使用Boost Interprocess

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM