próbuję skonstruować mapę w pamięci współdzielonej z następujących typówMapa <int, void*> w pamięci współdzielonej użyciu boost :: Interprocess
tworzę współdzielonego obszaru pamięci tak:
managed_shared_memory segment(create_only ,"MyMap" ,size);
ShMemAllocator_t alloc_inst (segment.get_segment_manager());
map = segment.construct<MyMap_t>("MyMap")
(std::less<int>()
,alloc_inst);
The wartości w mapie są następujące:
typedef pair<MutexType, boost::interprocess::offset_ptr<void> > ValueType ;
MutexType jest sama struktura zawierająca odczytu i zapisu (mutex korzystając read_lock i WRITE_LOCK); zdefiniowane następująco:
typedef struct mutex_struct{
sharable_lock<interprocess_mutex> read_lock(interprocess_mutex, defer_lock);
scoped_lock<interprocess_mutex> write_lock(interprocess_mutex, defer_lock);
} MutexType;
„wielkość” to łączna wielkość mapy (w zakresie przedmiotów, więc suma wielkości danych wskazywanego przez wszystkich void).
Jak mogę zagwarantować, że te puste dane * znajdują się również w tym segmencie pamięci, który utworzyłem, jak utworzyć instancję w istniejącym regionie pamięci współużytkowanej). Powodem tego jest to, że chcę przydzielić ten duży bufor tylko raz, ale ciągle usuwać/dodawać do niego obiekty (mapa modeluje pamięć podręczną). Muszę jeszcze znaleźć sposób, w jaki można przydzielić wiele obiektów w tym samym segmencie pamięci na mapie. Ponadto próba przypisania pary MutexType zwraca błąd kompilacji stwierdzający, że nie podano operatora "połączenia".
(Wiem, że jest trochę stara, ale) Zauważyłem, że blokada pisarza nie działa tak naprawdę w twoim przykładzie.Jeśli spawnujesz wiele obiektów potomnych pisarza, wartość i może być niezdefiniowana, a Ty spróbujesz wstawić parę używając tej samej wartości, z powodu problemów z współbieżnością - jeśli ten przykład powinien pokazać dodanie innego wpisu po ostatnim kluczu - wtedy metoda put powinna się zbierać bieżący rozmiar mapy i wstaw element o rozmiarze + 1. – Steve
Witam @Steve, nie jestem pewien, czy podążam. Dlaczego wartość 'i' jest niezdefiniowana? –
W pętli for - liczyć ++ i do momentu, gdy żadna wartość nie zostanie zwrócona z d.try_get - pozwala założyć, że jest teraz 10. Później próbujesz umieścić klucz i = 10 z d.put (i, v = std :: make_pair (MutexType(), p)) ;. Jeśli w międzyczasie inny proces zapisywania dziecka już wprowadzi coś na mapę - 10 będzie duplikatem. Załóżmy, że dwóch pisarzy-dzieci - każdy wykonuje jedną linię naraz - oboje docierają do i = 10, ale dziecko 1 stawia pierwszy wpis z i = 10 - w ten sposób drugie dziecko zawiedzie. To dlatego, że i = 10 znajduje się poza blokadą zapisu/odczytu – Steve