Запись для увеличения общей памяти - PullRequest
1 голос
/ 13 марта 2012

Должно быть, это был прямой ответ, но я нигде не нашел, как это сделать ...

Я успешно создал сегмент совместно используемой памяти с использованием системы IPC boost, как в примере:

boost::interprocess::managed_shared_memory segment(boost::interprocess::create_only, "MySharedMemory", 65536);

sharedData = segment.construct<MyType>("Test")(0, 0.2);

Мне также удалось прочитать значения из другого процесса. Что я не могу понять, так это как редактировать значения этой переменной (если мне разрешено вызывать «Test» как переменную) и читать их из другого процесса. Я хочу быть в цикле и записать эти значения.

Спасибо

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

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

Без дополнительного механизма сигнализации, использующего что-топодобно именованным каналам, нет никакого способа безопасно сигнализировать, что общий блок памяти

  • доступен для чтения
  • доступен для записи
  • обновлен

Если вы создадите блок памяти с флагом read_write, он установит правильные разрешения Windows.Пример в расширенной документации показывает это.

using boost::interprocess;
shared_memory_object shm_obj
   (open_only                    //only open
   ,"shared_memory"              //name
   ,read_write                   //read-write mode
   );
1 голос
/ 13 марта 2012

Как предположил @Konrad, использование общей памяти не так уж и хорошо.При этом Boost действительно предоставляет утилиты межпроцессной синхронизации, которые работают почти так же, как те, которые традиционно используются между потоками.

Дайте этой странице документации хорошее прочтение (особенно раздел об условиях)и посмотрим, может ли это дать вам представление о том, к чему следует стремиться.

...