Как освободить boost :: interprocess :: named_mutex при сбое процесса - PullRequest
1 голос
/ 03 июля 2019

Я использовал boost::interprocess для создания boost::multi_index структуры данных в разделяемой памяти.Есть много клиентских процессов, которые будут обращаться к этой структуре данных.При доступе я заблокирую структуру данных.Проблема, с которой я столкнулся, заключается в том, что как только клиентский процесс получает доступ к структуре данных и падает, не снимая занятую блокировку, все остальные клиентские процессы не могут получить доступ к структуре данных.Я использую boost::interprocess::named_mutex, я знаю, что boost::interprocess::file_lock может автоматически освобождаться при сбое процесса, но поскольку у него много ограничений, поэтому я не пользуюсь, я не знаю, есть ли хороший способ решить эту проблемупроблема, спасибо!

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Не помещайте мьютекс в разделяемую память.В документации повышения для named_mutex написано:

https://www.boost.org/doc/libs/1_70_0/doc/html/boost/interprocess/named_mutex.html

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

Весь смысл использования с именем Мьютекс состоит в том, что несколько процессов могут создавать свои собственные локальные объекты мьютекса, используя одно и то же имя, и у них будет общий мьютекс, с которым они могут синхронизироваться.Если данный процесс блокирует мьютекс, а затем падает, базовый общий мьютекс будет автоматически освобожден ОС, что позволит другому процессу заблокировать его (в зависимости от ОС базовый API мьютекса может сообщить, что мьютекс был разблокирован ненормально).

0 голосов
/ 03 июля 2019

Полагаю, вы можете попытаться получить доступ к мьютексу с помощью timed_lock и, если у вас есть тайм-аут, принудительно удалить мьютекс с помощью remove.

...