У меня есть класс, который может быть создан несколькими потоками. Но в одной функции код должен быть защищен, поэтому я решил использовать мьютекс межпроцессного ускорения. Каждый класс создает или открывает один и тот же мьютекс в своем конструкторе:
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. Никогда не бросает.
Это означает, что команда remove просто удаляет мьютекс из системы - даже если другой поток только что заблокировал его (я уже пробовал этот случай - он больше не заблокирован). Итак, моя проблема выглядит следующим образом: Например, у меня есть 3 потока (A, B и C) - теперь происходит следующее:
Итак, теперь кто-то может сказать: «Тогда не называйте удаление!» - Ну разве это возможно? Я имею в виду, что поскольку named_mutex пишет в систему, я сомневаюсь, что он будет удален без явного вызова, даже если программа завершится. У кого-нибудь есть помощь?