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

时间:2012-08-14 05:56:21

标签: c++ synchronization ipc boost-interprocess

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

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

来自队列的消费者receives此指示符并解组该对象。消费者负责释放内存块。

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

我的问题是:请注意每个流程都是单线程的,请allocate / deallocatesend / receive电话需要同步?

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

<小时/> 我见过this question,但它询问线程安全,而不是关于Boost.Interprocess的这些特定组件。

1 个答案:

答案 0 :(得分:6)

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

关于managed_shared_memory

  

命名/唯一分配/搜索/破坏的功能之一   是他们是原子的。命名分配使用递归   由内部mutex_family typedef定义的同步方案   定义了内存分配算法模板参数   (MemoryAlgorithm)。也就是说,用于同步的互斥锁类型   命名/唯一分配由。定义   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提供的保护可以保护您免受其他线程的侵害,就像它保护您免受其他进程一样。