/ / Boost Shared Memory - Returning Vector of Pointers - c ++, boost, shared-memory

Zwiększ pamięć współdzieloną - powracający wektor wskaźników - c ++, boost, pamięć dzielona

Używam boost :: interprocess :: mapped_region do przechowywania stałej tablicy structs które dzielę między różne procesy. Działa to dobrze, uzyskuję dostęp do tych struktur przez przesunięcie ID.

Na przykład.

Container_Struct* container = (Container_Struct*)mapped_region.get_address()

gdzie Container_Struct zawiera tablicę innej struktury, do której mogę uzyskać dostęp poprzez offset.

Na przykład.

MyData* data = container->dataArray[0];

Wiem, że nie jest to najbardziej elegancki sposób na dzielenie się danymi, ale jestem dopiero początkującym z interpreterami wspomagania i korzystaniem z map itp. Nie jest to dla mnie jasne.

Teraz chcę zwrócić listę / wektor wskaźników do wielu struktur MyData do różnych procesów.

Oczywiście nie mogę po prostu użyć std::vector<MyData*> kontener, ponieważ wektor jest tymczasowy i nieprawidłowy wśród procesów.

Jak miałbym stworzyć tymczasowy wektor wskaźników do MyData struct? Nie mogę po prostu utworzyć innego regionu do przechowywania wektorów, ponieważ nie byłoby to bezpieczne dla wątków, jeśli wiele procesów zażąda wektora wskaźników - nie chcę też żadnego obciążenia związanego z blokowaniem odczytu, ponieważ obecnie udostępniane dane są tylko odczytywane i nigdy napisane z dowolnego procesu - dlatego nie jest wymagana synchronizacja / blokada.

Powiedzmy, że chcę dodać funkcję do mojej udostępnionej biblioteki, która da mi wektor MyData* Wskaźniki oparte na liście indeksu ints, gdzie indeks jest przesunięciem w Container_Struct - jak mam to zrobić?

Odpowiedzi:

0 dla odpowiedzi № 1

Możesz użyć wektora boost::interprocess::offset_ptr do udostępniania wskaźników w segmencie pamięci w taki sposób, aby wskaźniki były użyteczne w różnych procesach, np .:

template <typename T>
using Ptr = boost::interprocess::offset_ptr<T>;

template <typename T>
using SharedVector = std::vector<
Ptr<T>,
boost::interprocess::allocator<Ptr<T>, boost::interprocess::shared_memory_segment::segment_manager>;

Oczywiście ty potrzeba wskazywać rzeczywiste litery T również w tym samym segmencie pamięci dla offset_ptr być w stanie pracować.

Wygląda na to, że lepiej byłoby z niego korzystać

  • boost :: multi_index_container (który może utrzymywać (wiele) indeksy w kontenerze) i dobrze rozumie alokatory Boost Interprocess

  • Zwiększaj natrętne pojemniki (które mogą tworzyć kolekcję „prostych” obiektów, które żyją „gdzie indziej”). Wbudowane haczyki intruzyjne wiedzą, jak używać boost::interprocess::offset_ptr w porządku