使用boost::interprocess,这个库公开了这个功能。
编辑:这里有一些你需要做的改变:
该示例已经定义了一个从共享内存块分配的分配器,您需要将其传递给map
和queue
。这意味着您必须更改定义:
class B
{
map<int, A, less<int>, MapShmemAllocator> table;
// Constructor of the map needs the instance of the allocator
B(MapShmemAllocator& alloc) : table(less<int>(), alloc)
{ }
}
对于queue
,这个稍微复杂一点,因为它实际上只是一个适配器,所以需要将真正的实现类作为模板参数传入:
typedef queue<int, deque<int, QueueShmemAllocator> > QueueType;
现在您的班级C
略有变化:
class C
{
B entries;
QueueType d, e;
C(MapShmemAllocator& allocM, QueueShmemAllocator& allocQ) : entries(allocM), d(allocQ), e(allocQ)
{ }
}
现在从段管理器中,C
使用分配器构造一个实例。
C *pC = segment.construct<C>("CInst")(allocM_inst, allocQ_inst);
我认为这应该可以解决问题。注意:您将需要提供两个分配器(一个 forqueue
和一个 for map
),不确定是否可以从同一个段管理器构造两个分配器,但我不明白为什么不能。