2008-11-04 4 views
8

У меня давно появилось желание контейнера STLish, который я мог бы разместить в сегменте разделяемой памяти или в карте памяти.У кого-нибудь есть хороший контейнер общей памяти для C++?

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

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

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

ответ

12

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

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

+1

Я поддерживаю этот ответ, используя личный опыт. Онлайн-руководство, сделанное с помощью IPC, ветерок! www.boost.org/doc/libs/1_36_0/doc/html/interprocess/quick_guide.html www.boost.org/doc/libs/1_36_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.mapped_file – pestophagous 2008-11-06 16:38:17

0

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

0

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

+0

Недостаточно охарактеризовать библиотеки BDE. Команда Lakos, разработанная в Bloomberg как «версия STL» - интерфейсы и компромиссы сильно отличаются друг от друга. – 2012-05-09 02:56:59

-1

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

+0

Я просто посмотрел на QSharedMemory - он просто дает доступ к общей памяти, он не предоставляет контейнеры любого типа. – 2009-11-04 11:58:28