Увеличьте команду named_mutex и remove ()

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

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) - теперь происходит следующее:

  1. Процесс A создает экземпляр класса, вызывает функцию и блокирует его
  2. Процесс B создает экземпляры класса, вызывает функцию, но не может получить доступ к коду (затем ждет, например,)
  3. Процесс A завершает работу с защищенным кодом, и он разблокируется
  4. Процесс B получает доступ к защищенному коду и блокирует его
  5. Процесс A удаляет экземпляр класса -> вызывается команда удаления
  6. Процесс C создает экземпляр класса, вызывает функцию и может получить доступ к коду, поскольку команда удаления удалила Mutex -> Error!

Итак, теперь кто-то может сказать: «Тогда не называйте удаление!» - Ну разве это возможно? Я имею в виду, что поскольку named_mutex пишет в систему, я сомневаюсь, что он будет удален без явного вызова, даже если программа завершится. У кого-нибудь есть помощь?

8
задан ildjarn 26 September 2011 в 18:06
поделиться