Zastosowanie boost::interprocess, biblioteka ta naraża tę funkcjonalność
... EDYCJA: Oto kilka zmian, które musisz wykonać:
Przykład już określa alokator, który będzie alokował z bloku pamięci współdzielonej, musisz przekazać to do map
i queue
. Oznacza to, że będziesz mieć aby zmienić swoje definicje:
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)
{ }
}
Dla queue
, jest to nieco skomplikowane, ze względu na fakt, że jest to naprawdę tylko adapter, więc trzeba przejść w realnym klasie wdrożenia jako parametr szablonu:
typedef queue<int, deque<int, QueueShmemAllocator> > QueueType;
Teraz twoja klasa C
zmiany nieznacznie :
class C
{
B entries;
QueueType d, e;
C(MapShmemAllocator& allocM, QueueShmemAllocator& allocQ) : entries(allocM), d(allocQ), e(allocQ)
{ }
}
teraz od kierownika segmentu, konstruować wystąpienie C
z podzielnika.
C *pC = segment.construct<C>("CInst")(allocM_inst, allocQ_inst);
Myślę, że powinienem załatwić sprawę. UWAGA: Musisz podać dwa podzielniki (jeden dla queue
i jeden dla map
), nie wiesz, czy możesz zbudować dwa podzielniki z tego samego menedżera segmentów, ale nie widzę powodu, dlaczego nie.
To nie jest łatwe. Potrzebowałbyś specjalnego przydziału dla wszystkich swoich kontenerów, które wiedzą o pamięci współdzielonej. W C++ 11 jest to nieco łatwiejsze do wdrożenia dzięki stanowym alokatorom, ale w żadnym wypadku nie jest to banalne. –
Która platforma? – tenfour
To zależy od platformy. – someguy