У меня есть класс, который может быть создан несколькими потоками.Но в одной функции код должен быть защищен, поэтому я решил использовать буст-мьютекс между процессами.Каждый класс создает или открывает один и тот же Mutex в своем конструкторе:
MyClass::MyClass()
{
boost::interprocess::named_mutex m_Lock(
boost::interprocess::open_or_create, "myLock" );
}
Так что теперь наступает момент, когда критическая часть кода вызывается:
int MyClass::MyFunction()
{
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(
m_Lock, boost::interprocess::try_to_lock);
if(!lock)
{
return -1;
}
// else do some stuff here
}
Очистить после функции(и как это описано на странице повышения) Я использую команду удаления в деструкторе своего класса:
MyClass::~MyClass()
{
boost::interprocess::named_mutex::remove("myLock");
}
На самом деле весь этот код работает нормально, но у меня есть одна проблема:
Как сказано в описании команды удаления:
Стирает именованный мьютекс из системы.Возвращает false при ошибке.Никогда не бросает.
Это означает, что команда удаления просто удаляет мьютекс из системы - даже если другой поток только что заблокировал его (я уже пробовал этот случай - он больше не заблокирован).Поэтому моя проблема заключается в следующем: например, у меня есть 3 потока (A, B и C) - теперь происходит следующее:
- Процесс A создает экземпляр класса, вызывает функцию и блокирует ее
- Процесс B создает экземпляры класса, вызывает функцию, но не может получить доступ к коду (затем ожидает, например)
- Процесс A завершает работу с защищенным кодом и разблокируется
- Процесс B получает доступ к защищенному коду и блокирует его
- Процесс A удаляет экземпляр класса -> команда удаления называется
- Процесс C создает экземпляр класса, вызываетфункция и может получить доступ к коду, так как команда удаления стерла Mutex -> Ошибка!
Так что теперь кто-то может сказать: «Тогда не вызывайте удалить!» - Ну, это возможно?Я имею в виду, что так как named_mutex пишет в систему, я сомневаюсь, что он стирается без явного вызова, даже если программа заканчивается.У кого-нибудь есть помощь?