这些Boost :: Interprocess组件是否需要同步?

Ant*_*ony 3 c++ synchronization ipc boost-interprocess

我正在使用IPC构建一个多生产者/单一消费者应用程序,使用Boost.Interprocess实现.

每个生产者通过在共享内存(managed_shared_memory::allocate)内部分配块来发送消息,并将对象编组到该块中.然后,它通过a发送一个小对象,message_queue它保存块的位置(偏移量)和大小.

消费者receives从队列中获取此指示符并解组该对象.消费者负责释放内存块.

基于此实现,我不相信内存中存在的对象或块需要同步,因为一旦消费者知道它们,生产者将不再触摸它们.因此,我认为只有内部message_queuemanaged_shared_memory需要同步.

我的问题是:请记住每个进程都是单线程的,do allocate/ deallocate,和send/ receivecalls需要同步吗?

文档提供的Boost示例不使用消息队列的同步,但我认为这只是为了简化示例源.


我已经看到了这个问题,但是它询问了线程安全性,而不是关于Boost.Interprocess的这些特定组件.

jle*_*ahy 6

您无需使用任何类型的锁定来保护这些操作.它们已在共享内存中使用递归互斥锁进行保护,否则多个进程将无法同时在同一共享内存块中运行.

关于managed_shared_memory:

命名/唯一分配/搜索/破坏的一个特征是它们是原子的.命名分配使用由内存分配算法模板参数(MemoryAlgorithm)定义的内部mutex_family typedef定义的递归同步方案.也就是说,用于同步命名/唯一分配的互斥锁类型由MemoryAlgorithm::mutex_family::recursive_mutex_type类型定义 .对于共享内存和基于内存映射文件的托管段,此递归互斥锁定义为boost::interprocess::interprocess_recursive_mutex.

这也扩展到原始分配,您可以通过查看来验证这一点boost/interprocess/mem_algo/detail/simple_seq_fit.hpp.

对于消息队列,将其boost::interprocess视为与互斥锁相同的同步机制,它将负责所有必要的保证,锁定其内部数据结构并根据需要发出内存屏障.

此外,这同样适用于多线程编程.即使你在同一个程序中调用send或从多个线程分配,一切都会好的.锁定boost::interporcess提供将保护您免受其他线程的影响,就像它保护您免受其他进程一样.