Boost.interprocess Vector作为类成员

时间:2017-07-25 09:50:27

标签: c++ boost boost-interprocess

我想使用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);

- 更新 -

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

1 个答案:

答案 0 :(得分:1)

本质:

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

出于同样的原因,将eachCaseJsonObject.getBoolean("JSON_IS_IDENTIFIED") 存储在共享内存之外是没用的,您可以简单地用原始指针替换它。

进一步的头脑风暴

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

您/可以/当然将SELECT Opendate,Month(Opendate), (CASE WHEN (Month(Opendate)/6.0)<=1 THEN 1 ELSE 2 END) HALF_YEAR FROM TableName where Opendate <> '1900-01-01 00:00:00.000' 存储在共享内存中。如果可以共享offset_ptr中的所有数据,这可能会有所帮助。

如果你需要分享MainStruct的那一部分,那么显而易见:

MainStruct

使用char的共享向量替换'raw'offset_ptr`的温和建议。