Uso boost::interprocess, esta biblioteca expone esta función
... EDIT: Aquí hay algunos cambios que necesita hacer:.
el ejemplo ya define un asignador que asignar del segmento de memoria compartida, se necesita pasar esto a la map
y la queue
esto significa que tendrá para cambiar sus definiciones:
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)
{ }
}
Para queue
, esto es un poco complicado, debido al hecho de que en realidad es sólo un adaptador, por lo que necesita para pasar en la clase de implementación real como un parámetro de plantilla:
typedef queue<int, deque<int, QueueShmemAllocator> > QueueType;
ahora su clase C
cambia ligeramente :
class C
{
B entries;
QueueType d, e;
C(MapShmemAllocator& allocM, QueueShmemAllocator& allocQ) : entries(allocM), d(allocQ), e(allocQ)
{ }
}
Ahora desde el gestor de segmento, construir una instancia de C
con el asignador.
C *pC = segment.construct<C>("CInst")(allocM_inst, allocQ_inst);
Creo que debería hacer el truco. NOTA: Necesitará proporcionar dos asignadores (uno para queue
y otro para map
), sin estar seguro si puede construir dos asignadores desde el mismo administrador de segmentos, pero no veo por qué no.
Esto no es fácil. Necesitará un asignador especial para todos sus contenedores que sepa sobre la memoria compartida. En C++ 11 esto es un poco más fácil de implementar gracias a los asignadores con estado, pero no es trivial en ningún caso. –
¿Qué plataforma? – tenfour
Esto depende de la plataforma. – someguy