这些 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_queuemanaged_shared_memory的内部需要同步。

我的问题是:记住每个进程都是单线程的,allocate/deallocatesend/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 与复杂的嵌套类

boost::interprocess::string 转换为 char*

boost::interprocess::interprocess_condition::wait 在等待时不会原子地解锁互斥锁

boost::interprocess::message_queue 权限被拒绝

Boost.interprocess Vector 作为类成员