2015-06-27 3 views
0

boost::interprocess::managed_shared_memorymanual и most other Ресурсы, которые я проверил, всегда показывает примеры, где есть родительский процесс и куча детей, порожденных им.Как стереть содержимое boosted_shared_memory?

В моем случае у меня есть несколько процессов, порожденных приложением третьей части, и я могу управлять только «детьми». Это означает, что я не могу иметь центральный мозг для распределения и освобождения сегмента разделяемой памяти. Все мои процессы должны быть в состоянии сделать это (Поэтому я не могу стереть данные при выходе).

Моя идея состояла в том, чтобы отредактировать сегмент и, используя блокировку (find_or_construct 'ed) в этой области, я проверяю определенный хэш, чтобы определить, была ли область памяти создана той же версией программного обеспечения.

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

В идеале я хотел бы сохранить объект блокировки, потому что на нем могут ждать другие процессы.

Things I, хотя:

  1. Список всех имен объектов и удалить все, кроме замка.

    • Это не может быть сделано, так как объекты могут использовать различные реализации
    • Кроме того, я не мог найти, где список имен.
  2. Использование shared_memory_object::truncate

    • Я не смог найти много об этом
    • Используя managed_shared_memory, я не знаю, насколько надежно это будет, потому что я не уверен, что замок был первые выделенные данные.
  3. RefCount процессы и вытирают данные о прошлом один

    • Склонный к фатальным проблемам терминации.
  4. Используйте разделенную область общей памяти только для этой бухгалтерии.

    • Звучит разумно, но излишний?

Любые предложения или идеи?

ответ

1

Это звучит как сценарий «совместного использования».

Что вы обычно думать в таком случае, будет общие указатели:

Interprocess специализируется общие указатели (и поддакивать make_shared) именно для этой цели ,

Создание области разделяемой памяти может быть выполнено «оптимистично» из каждого участвующего процесса (open_or_create). Обратите внимание, что создание необходимо синхронизировать. Другие операции диспетчера сегментов обычно уже неявно синхронизируются:

Всякий раз, когда доступ к одной и той же управляемой общей памяти осуществляется из разных процессов, такие операции, как создание, поиск и уничтожение объектов, автоматически синхронизируются. Если две программы пытаются создать объекты с разными именами в управляемой разделяемой памяти, доступ сериализуется соответствующим образом. Для выполнения нескольких операций за один раз без прерывания операций из другого процесса используйте функцию-член atomic_func() (см. Example 33.11).

+0

Меня больше интересует целостность памяти и как/когда я должен удалить stuf. Я закончил свой вариант 4 (хотя некоторые из тех же проблем все еще возникают). Использование 'atomic_func()' лучше, чем моя идея создания блокировки внутри разделяемой памяти, но я считаю, что оба подхода приведут к одному и тому же результату (только меньшее количество шаблонов, что отлично). +1 – JBernardo

+0

Я не понимаю. Целостность памяти с использованием подхода с общим указателем/слабым указателем является *** строго лучше ***, чем все, что вы можете организовать вручную. Всегда будет лазейка ненормальных завершений процесса (например, SIGKILL), но это независимо и может быть «разрешено» только с использованием транзакций на основе диска (регистрация целей). Помимо темы здесь – sehe

+0

Поскольку память переживает ** все ** мои процессы, у меня могут быть проблемы между циклами. Некоторые структуры данных могут измениться, и, конечно же, не исключены аномальные окончания. – JBernardo

Смежные вопросы