boost — C ++ Mutex для Windows

Я работаю над проектом C ++ для Windows и нуждаюсь в хорошей реализации мьютекса для синхронизации ч / б процессов (т.е. обертка для winapi). В настоящее время я использую boost :: interprocess :: named_mutex, однако заметил, что в случае сбоя одного из процессов мьютекс остается заблокированным навсегда (даже после перезагрузки!). Погуглив этот вопрос подтвердил, что это на самом деле поведение.

Откровенно говоря, я не понимаю, как такое поведение приемлемо для любого проекта. Существуют ошибки, происходит сбой процессов — это просто означает, что маленькая ошибка может привести к тому, что система больше никогда не будет работать … Недопустимо!

Итак, мои вопросы:

  1. Может ли кто-нибудь порекомендовать другую реализацию, которая имеет «нормальное» поведение (т. Е. Мьютекс перестает работать при сбое, а после перезагрузки системы «сбрасывается», чтобы работать как обычно)? Кроссплатформенность явно лучше, но определенно не обязательна.

  2. Из любопытства — как это возможно, что повышение позволяет этому поведению быть ??

Спасибо!

3

Решение

документация для boost :: interprocess объясняет постоянство разных классов. В случае named_mutex он указан как ядро ​​или файловая система. Исходя из этого, мы можем предположить, что реализация Windows использует файловую систему, поэтому она сохраняется после перезагрузки системы.

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

4

Другие решения

Взгляните на StlSoft’s process_mutex. Кроссплатформенность (используйте компонент platformstl, а не версии ОС, определенные для winstl или unixstl) и только заголовок.

0

По вопросам рекламы [email protected]