Я работаю над проектом C ++ для Windows и нуждаюсь в хорошей реализации мьютекса для синхронизации ч / б процессов (т.е. обертка для winapi). В настоящее время я использую boost :: interprocess :: named_mutex, однако заметил, что в случае сбоя одного из процессов мьютекс остается заблокированным навсегда (даже после перезагрузки!). Погуглив этот вопрос подтвердил, что это на самом деле поведение.
Откровенно говоря, я не понимаю, как такое поведение приемлемо для любого проекта. Существуют ошибки, происходит сбой процессов — это просто означает, что маленькая ошибка может привести к тому, что система больше никогда не будет работать … Недопустимо!
Итак, мои вопросы:
Может ли кто-нибудь порекомендовать другую реализацию, которая имеет «нормальное» поведение (т. Е. Мьютекс перестает работать при сбое, а после перезагрузки системы «сбрасывается», чтобы работать как обычно)? Кроссплатформенность явно лучше, но определенно не обязательна.
Из любопытства — как это возможно, что повышение позволяет этому поведению быть ??
Спасибо!
документация для boost :: interprocess объясняет постоянство разных классов. В случае named_mutex он указан как ядро или файловая система. Исходя из этого, мы можем предположить, что реализация Windows использует файловую систему, поэтому она сохраняется после перезагрузки системы.
В зависимости от вашей ситуации вы можете записать свой собственный файл на диск для каждого процесса, а затем удалить его, если процесс благополучно закрывается. Когда процесс перезапускается, если тьфу существует, должно быть, было нечистое завершение, и вы могли бы использовать повышение :: межпроцессного :: named_mutex :: удалить статическая функция для удаления мьютекса.
Взгляните на StlSoft’s process_mutex. Кроссплатформенность (используйте компонент platformstl, а не версии ОС, определенные для winstl или unixstl) и только заголовок.