Boost.interprocess Vector 作为类成员

Posted

技术标签:

【中文标题】Boost.interprocess Vector 作为类成员【英文标题】:Boost.interprocess Vector as class member 【发布时间】:2017-07-25 09:50:27 【问题描述】:

我想使用 Boost.Interprocess 在共享内存中放置一个结构。该结构将在两个进程之间共享,作为序列化数据的主要交换区。我目前正在寻找最简单的最佳解决方案。

namespace bi = boost::interprocess;

typedef bi::allocator<SimpleData, bi::managed_shared_memory::segment_manager>   ShmemSimpleDataAllocator;
typedef bi::vector<SimpleData, ShmemSimpleDataAllocator>                        SimpleDataVector;

struct SimpleData

    SimpleData() 
    SimpleData(char* ptr)
        :data(ptr)
    

    /** Offset pointer to the data */
    bi::offset_ptr<char> data;
;

// Main shared structure
struct SharedMainStruct // EDITED, thanks Sehe

    SharedMainStruct(ShmemSimpleDataAllocator simple_allocator)
     :m_inputs(simple_allocator),
      m_outputs(simple_allocator)
    

    // Inputs, outputs and properties
    SimpleDataVector    m_inputs;
    SimpleDataVector    m_outputs;

    bi::interprocess_mutex     m_mutex;
    bi::interprocess_condition m_cond;
;

// Main code here
// Create managed shared memory
my_sho= new bi::managed_shared_memory (bi::create_only, "test_SO", 1000000);

// Build main structure in shared memory
ShmemSimpleDataAllocator data_allocator(my_sho->get_segment_manager());
m_main_struct = my_sho->construct<SharedMainStruct>("main")(data_allocator); // (1)

想法是将这个SharedMainStruct 放在共享内存中,以便两个进程都可以访问它。此代码行 (1) 是否正确?我猜我错过了文档中的一些运行时代码,对吗?喜欢:

//Initialize shared memory STL-compatible allocator
const ShmemSimpleDataAllocatoralloc_inst (segment.get_segment_manager());

//Construct a vector named "MyVector" in shared memory with argument alloc_inst
SimpleDataVector* myvector = segment.construct<SimpleDataVector>("SimpleDataVector")(alloc_inst);

-- 更新--

是的,向量可以存储为成员变量。我们应该提供分配器作为构造函数的参数...

【问题讨论】:

【参考方案1】:

本质:

类在内存中是连续布局的,因此您不能字面上选择性地将它的某些部分存储在共享内存中。

出于同样的原因,将offset_ptr 存储在共享内存之外是没有用的,您可以简单地用原始指针替换它。

进一步的头脑风暴

前两句话应该足以消除任何混淆。

您/可以/当然将MainStruct 存储在共享内存中。如果MainStruct 中的所有数据都可以共享,这可能会有所帮助。

如果您只需要分享MainStruct 的那部分内容,显然应该明确表示:

// Inputs, outputs and properties
struct SharedBuffers 
     template <typename Alloc> 
     SharedBuffers(Alloc alloc = ) : m_inputs(alloc), m_outputs(alloc) 

     Shared::Vector<SimpleData> m_inputs;
     Shared::Vector<SimpleData> m_outputs;
;

SharedBuffers* m_buffers; // bip::offset_ptr<> is overkill outside shared memory

建议将“原始”offset_ptr 替换为 char 的共享向量。

【讨论】:

是的,我想将所有MainStruct 放在共享内存中。我在我的代码中指定:m_main_struct = m_sho-&gt;construct&lt;MainStruct&gt;("main")();. 那你为什么要关心向量呢?只要确保他们使用共享内存分配器,就开心了。 好吧,我想我离幸福不远了。我只是试图找到解决我问题的最佳方法。我部分重写了我的问题。从您的代码中,我的印象是我可以通过提供分配器作为参数来通过初始化列表构建我的向量成员。对吗? 你是对的。我试过这个ShmemSimpleDataAllocator data_allocator(m_sho-&gt;get_segment_manager()); m_main_struct = m_sho-&gt;construct&lt;MainStruct&gt;("main")(data_allocator);,它似乎运作良好。非常感谢,我不清楚那部分文档。 确实如此。我有很多关于 Boost Inteprocess 的答案,包括 scoped_allocator_adaptor 可能会让你的生活更轻松。随意浏览它们

以上是关于Boost.interprocess Vector 作为类成员的主要内容,如果未能解决你的问题,请参考以下文章

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

boost::interprocess_mutex 与进程本地 boost::mutex

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

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

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

Boost Interprocess 找不到 boost/config/user.hpp