У кого-нибудь есть хороший контейнер с общей памятью для C ++? - PullRequest
8 голосов
/ 04 ноября 2008

У меня давно возникла потребность в контейнере STLish, который я мог бы поместить в сегмент совместно используемой памяти или файл отображения памяти.

Я рассмотрел использование пользовательского распределителя и размещения нового для размещения обычного контейнера STL в сегменте общей памяти. (как этот ddj статья ). Проблема в том, что контейнеры STL будут внутренне иметь указатели на память, которой они владеют. Следовательно, если сегмент общей памяти или файл с отображенной памятью загружаются по другому базовому адресу (возможно, при последующем запуске или во втором процессе), то внутренние указатели внезапно становятся недействительными. Насколько я могу понять, подход с пользовательским распределителем работает только в том случае, если вы всегда можете отобразить сегмент памяти в свой процесс по тому же адресу. По крайней мере, с файлами, отображаемыми в память, у меня есть большой опыт того, что этого не случится, если вы просто позволите системе отобразить его там, где он когда-либо ощущается.

У меня были некоторые мысли о том, как это сделать, но я бы хотел избежать этого, если кто-то уже сделал работу (это я, ленивый).

В настоящее время я исключаю блокировку из обсуждения, поскольку лучшая стратегия блокировки сильно зависит от приложения.

Ответы [ 5 ]

12 голосов
/ 04 ноября 2008

Лучшей отправной точкой для этого, вероятно, являются библиотеки Interprocess boost. У них есть хороший пример карты в общей памяти здесь: межпроцессная карта

Возможно, вы также захотите прочитать раздел о смещенных интеллектуальных указателях, который решает проблему внутренних указателей, на которую вы ссылались. Указатель смещения

0 голосов
/ 04 ноября 2009

Попробуйте использовать реализацию Qt QSharedMemory.

0 голосов
/ 10 ноября 2008

Я знаю только о проприетарных версиях. Bloomberg и EA опубликовали свои версии STL, но, насколько мне известно, плоды их труда не опубликовали.

0 голосов
/ 06 ноября 2008

У меня всегда был хороший опыт (годы назад) с ACE . Это сетевая / коммуникационная среда, но есть раздел с общей памятью.

0 голосов
/ 04 ноября 2008

Вы также можете воспользоваться контейнерами Intel Threading Building Blocks (TBB) .

...