interprocess :: named_upgradable_mutex - остается заблокированным, если процесс убит - PullRequest
1 голос
/ 14 декабря 2011

Я использую boost::interprocess::named_upgradable_mutex для синхронизации нескольких процессов.

Я использую boost::interprocess::sharable_lock и boost::interprocess::scoped_lock для блокировки мьютекса.

При тестировании синхронизации все выглядит нормально, пока процессы работают, и нормально закрываются.

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

Любая идея, как я могу обрабатывать сбои процесса?

Я думал об использовании timed_lock() на всякий случай ... есть еще идеи?

Ответы [ 2 ]

1 голос
/ 13 мая 2012

Если по какой-либо причине вы убьете свое приложение, вы можете разблокировать эту блокировку либо путем выхода из Windows, либо выполнив команду mutex.unlock ();

1 голос
/ 14 декабря 2011

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

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

Если вам действительно нужно это сделать, я бы предположил, что вы, вероятно, не используете правильный инструмент для этой работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...