首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >作为类成员的Boost.interprocess向量

作为类成员的Boost.interprocess向量
EN

Stack Overflow用户
提问于 2017-07-25 09:50:27
回答 1查看 353关注 0票数 1

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

代码语言:javascript
运行
复制
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)正确吗?我想我错过了一些像文档中的运行时代码,对吗?比如:

代码语言:javascript
运行
复制
//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);

-更新--

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-25 13:11:36

本质:

类是在内存中连续排列的,因此不能将其中的某些部分选择性地存储在共享内存中。

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

进一步集思广益

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

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

如果您需要只共享MainStruct的这一部分,那么很明显,这一点是明确的:

代码语言:javascript
运行
复制
// 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

温和的建议用一个共享的char向量代替“raw”offset_ptr`。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45299699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档