Как безопасно удалить boost :: shared_memory_object - PullRequest
2 голосов
/ 31 октября 2011

Я использую boost :: shared_memory_object для IPC.У меня есть клиент и сервер.Я использую две очереди сообщений.Один для отправки запросов на сервер и один для получения ответов от сервера.Это асинхронный протокол.Моя проблема в том, что я не знаю, как безопасно удалить shared_memory_objects в случае сбоев.Рассмотрим следующий сценарий:

  1. Сервер запускается
  2. Клиент запускается и подключается к серверу;очереди сообщений создаются в общей памяти.
  3. Клиент отправляет регулярные импульсы на сервер;все в порядке.
  4. Клиент слишком долго обрабатывается;пропускает некоторые тактовые импульсы
  5. Сервер считает, что клиент мёртв, очищает очереди (shared_memory_object :: remove удалит очередь, даже если есть запущенный процесс с дескриптором для этого открытого сегмента общей памяти)
  6. Клиент заканчивает обработку;пытается записать в очередь сообщений, которая была удалена:

Здесь все разрушается.Иногда запись успешна, иногда происходит сбой.Кто знает, создал ли другой процесс после удаления очереди сообщений новые объекты общей памяти с тем же адресом памяти ...

Понятно, если клиент считает, что сервер не работает, и удаляет очередьзатем поток сервера, который пытается выполнить чтение / запись в очередь, может привести к сбою (или повреждению памяти).

...