这些 Boost::Interprocess 组件是不是需要同步?
Posted
技术标签:
【中文标题】这些 Boost::Interprocess 组件是不是需要同步?【英文标题】:Do these Boost::Interprocess components require synchronisation?这些 Boost::Interprocess 组件是否需要同步? 【发布时间】:2012-08-14 05:56:20 【问题描述】:我正在使用 IPC 构建一个多生产者/单消费者应用程序,使用 Boost.Interprocess 实现。
每个生产者通过在共享内存 (managed_shared_memory::allocate
) 中分配一个块并将一个对象编组到该块中来发送消息。然后,它通过message_queue
发送一个小对象,该对象保存块的位置(偏移量)和大小。
消费者receives
这个指示器从队列中解组并解组对象。消费者负责释放内存块。
基于这个实现,我不相信内存中存在的对象或块需要同步,因为一旦消费者知道它们,生产者将不再接触它们。因此,我认为只有message_queue
和managed_shared_memory
的内部需要同步。
我的问题是:记住每个进程都是单线程的,allocate
/deallocate
和send
/receive
调用需要同步吗?
文档提供的Boost示例没有使用消息队列的同步,但我认为这只是为了简化示例源。
我见过this question,但它询问的是线程安全,而不是Boost.Interprocess 的这些特定组件。
【问题讨论】:
【参考方案1】:您不需要使用任何类型的锁定来保护这些操作。它们已经在共享内存中使用递归互斥锁进行保护,否则多个进程将无法同时在同一个共享内存块中操作。
关于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 或 allocate 一切都会好起来的。 boost::interporcess
提供的锁定将保护您免受其他线程的侵害,就像它保护您免受其他进程的侵害一样。
【讨论】:
以上是关于这些 Boost::Interprocess 组件是不是需要同步?的主要内容,如果未能解决你的问题,请参考以下文章
boost::interprocess_mutex 与进程本地 boost::mutex
boost::interprocess::string 转换为 char*
boost::interprocess::interprocess_condition::wait 在等待时不会原子地解锁互斥锁