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

StackOverflow https://stackoverflow.com/questions/262714

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top