Boost.interprocess 矢量作为 class 成员
Boost.interprocess Vector as class member
我想使用 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);
-- 更新--
是的,向量可以存储为成员变量。我们应该提供分配器作为构造函数的参数...
精华:
类 在内存中连续布局,因此您不能字面上 有选择地将它的某些部分存储在共享内存中。
出于同样的原因,将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
建议将 'raw' offset_ptr` 替换为共享的 char 向量。
我想使用 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);
-- 更新--
是的,向量可以存储为成员变量。我们应该提供分配器作为构造函数的参数...
精华:
类 在内存中连续布局,因此您不能字面上 有选择地将它的某些部分存储在共享内存中。
出于同样的原因,将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
建议将 'raw' offset_ptr` 替换为共享的 char 向量。