boost::interprocess::managed_shared_memory
manual и most other Ресурсы, которые я проверил, всегда показывает примеры, где есть родительский процесс и куча детей, порожденных им.Как стереть содержимое boosted_shared_memory?
В моем случае у меня есть несколько процессов, порожденных приложением третьей части, и я могу управлять только «детьми». Это означает, что я не могу иметь центральный мозг для распределения и освобождения сегмента разделяемой памяти. Все мои процессы должны быть в состоянии сделать это (Поэтому я не могу стереть данные при выходе).
Моя идея состояла в том, чтобы отредактировать сегмент и, используя блокировку (find_or_construct
'ed) в этой области, я проверяю определенный хэш, чтобы определить, была ли область памяти создана той же версией программного обеспечения.
Если это неверно, сегмент памяти необходимо стереть, чтобы избежать нарушения кода.
В идеале я хотел бы сохранить объект блокировки, потому что на нем могут ждать другие процессы.
Things I, хотя:
Список всех имен объектов и удалить все, кроме замка.
- Это не может быть сделано, так как объекты могут использовать различные реализации
- Кроме того, я не мог найти, где список имен.
Использование
shared_memory_object::truncate
- Я не смог найти много об этом
- Используя
managed_shared_memory
, я не знаю, насколько надежно это будет, потому что я не уверен, что замок был первые выделенные данные.
RefCount процессы и вытирают данные о прошлом один
- Склонный к фатальным проблемам терминации.
Используйте разделенную область общей памяти только для этой бухгалтерии.
- Звучит разумно, но излишний?
Любые предложения или идеи?
Меня больше интересует целостность памяти и как/когда я должен удалить stuf. Я закончил свой вариант 4 (хотя некоторые из тех же проблем все еще возникают). Использование 'atomic_func()' лучше, чем моя идея создания блокировки внутри разделяемой памяти, но я считаю, что оба подхода приведут к одному и тому же результату (только меньшее количество шаблонов, что отлично). +1 – JBernardo
Я не понимаю. Целостность памяти с использованием подхода с общим указателем/слабым указателем является *** строго лучше ***, чем все, что вы можете организовать вручную. Всегда будет лазейка ненормальных завершений процесса (например, SIGKILL), но это независимо и может быть «разрешено» только с использованием транзакций на основе диска (регистрация целей). Помимо темы здесь – sehe
Поскольку память переживает ** все ** мои процессы, у меня могут быть проблемы между циклами. Некоторые структуры данных могут измениться, и, конечно же, не исключены аномальные окончания. – JBernardo