我想使用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作为构造函数的参数......
答案 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`的温和建议。