У кого-нибудь есть хороший контейнер с общей памятью для C ++?
-
06-07-2019 - |
Вопрос
У меня давно возникла потребность в контейнере STLish, который я мог бы поместить в сегмент общей памяти или файл отображения памяти.
Я подумал об использовании пользовательского распределителя и размещения нового для размещения обычного контейнера STL в сегменте общей памяти. (например, статья ). Проблема в том, что контейнеры STL будут внутренне иметь указатели на память, которой они владеют. Следовательно, если сегмент общей памяти или файл с отображенной памятью загружаются по другому базовому адресу (возможно, при последующем запуске или во втором процессе), то внутренние указатели внезапно становятся недействительными. Насколько я могу понять, подход с пользовательским распределителем работает только в том случае, если вы всегда можете отобразить сегмент памяти в свой процесс по тому же адресу. По крайней мере, с файлами, отображенными в память, у меня есть большой опыт того, что это НЕ так, если вы просто дадите системе отобразить ее там, где она когда-либо ощущается.
У меня были некоторые мысли о том, как это сделать, но я бы хотел избежать этого, если кто-то уже сделал работу (это я, ленивый).
В настоящее время я исключаю блокировку из обсуждения, поскольку лучшая стратегия блокировки сильно зависит от приложения.
Решение
Лучшей отправной точкой для этого, вероятно, является расширение межпроцессных библиотек. У них есть хороший пример карты в общей памяти здесь: карта межпроцессных операций р>
Возможно, вы также захотите прочитать раздел о смещенных интеллектуальных указателях, который решает проблему внутренних указателей, на которую вы ссылались. указатель смещения р>
Другие советы
Вы также можете воспользоваться Контейнеры Intel Threading Building Blocks (TBB) .
У меня всегда был хороший опыт (несколько лет назад) с ACE . Это сетевая / коммуникационная среда, но есть раздел с общей памятью.
Попробуйте использовать реализацию Qt QSharedMemory.