Windows - Как очистить объект общей памяти, оставленный процессами, аварийно завершенными? - PullRequest
0 голосов
/ 04 июня 2018

Я столкнулся с проблемой, когда процесс ненормально завершился и, следовательно, некоторые общие ресурсы (BaseNamedObjects) остались не выпущенными процессом.

CreateFileMapping функция возвращает ERROR_ALREADY_EXISTS, что указывает на то, что разделяемая память уже существует.

После получения ERROR_ALREADY_EXISTS с помощью CreateFileMapping возвращает дескриптор.Таким образом, у меня есть следующие запросы, связанные с вышеупомянутым сценарием:

  1. Можем ли мы выполнить очистку, используя этот возвращенный дескриптор?
  2. Можем ли мы использовать возвращаемый дескриптор CreateFileMapping?
  3. как очистить такой объект общей памяти?

1 Ответ

0 голосов
/ 04 июня 2018

Возвращенный дескриптор полностью действителен для того, чтобы вы могли продолжать его использовать, и вы должны закрыть этот дескриптор, когда закончите использовать его как обычно.Однако закрытие этого дескриптора не приведет к освобождению памяти или выполнению очистки: ваш новый вызов увеличил количество ссылок на общий ресурс, а закрытие просто вернет его к его предыдущему состоянию.

Кажется вероятнымчто есть какой-то другой процесс, все еще использующий разделяемую память, поскольку операционная система должна восстановить ее после фатального завершения процесса.

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

Возможно, ваш другой процесс на самом деле не умер, но находится в фатальном цикле или безнадеженожидание, состояние.Чтобы выйти из этого случая, вы можете сохранить все идентификаторы процессов в общей области, и любой новый процесс с доступом к общей области может затем УБИТЬ всех старых участников.

...