интерпроцесс Boost с именем мьютекс остается полученным после сбоя

Я использую boost::interpocess::scoped_lock, используя named_mutex и timeout; Я работаю в ОС Linux.

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

Вдобавок ко всему, если вы посмотрите на приведенный ниже код, я ожидаю, что через 150 микросекунд синхронизированный scoped_lock вернется, чтобы дать мне ошибку ... но это не так ... он просто зависает.

      #include <boost/interprocess/sync/named_mutex.hpp>
      namespace bi = boost::interprocess;
      bi::named_mutex m_mutex;

 try{
      boost::posix_time::ptime pt( 
          boost::posix_time::microsec_clock::local_time() ) ;

      pt+= boost::posix_time::microseconds( 150 );
      bi::scoped_lock< bi::named_mutex > lock( m_mutex, pt );

      if( !lock.owns() ){
        FATAL( "I didn't acquire the lock." );
           return EXIT_FAILURE;
      }
     ....

Мои вопросы следующие:

  1. Как убедиться, что именованный мьютекс boost::interprocess уничтожен? (так как увидеть общий мьютекс между процессами и как их уничтожить)
  2. Почему получение мьютекса не возвращается через 150 микросекунд? Что-то не так в приведенном ниже коде?

Большое спасибо

АФГ


person Abruzzo Forte e Gentile    schedule 18.10.2011    source источник


Ответы (4)


Я нашел решение: я пропустил вызов следующего, чтобы уничтожить мьютекс

 boost::interprocess::named_mutex::remove( "MutexName" );

Этот код выполняет всю необходимую очистку.

person Abruzzo Forte e Gentile    schedule 19.10.2011

boost::interprocess::named_mutex::remove( "MutexName" ); 

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

person Borislav Ervacanin    schedule 09.04.2015

Именованный мьютекс не освобождается при сбое в unix, вместо этого попробуйте boost::interprocess::file_lock. Когда происходит сбой, блокировка снимается.

person east    schedule 18.08.2015
comment
В моем случае он тоже остался приобретенным на Windows - person Vasilly.Prokopyev; 08.09.2015

не используйте функцию local_time() вместо универсальной_time(): boost::posix_time::ptime abs_time = boost::posix_time::microsec_clock::universal_time() + boost::posix_time::milliseconds(150);

шкафчик scoped_lock (мьютекс, абс_время);

в случае сбоя процесса вы должны зафиксировать сигнал сбоя и разблокировать named_mutex или иметь поток в качестве таймера для проверки блокировки и разблокировки.

при использовании boost::interprocess::file_lock будут возникать новые проблемы, будьте осторожны!!!

person Eric Xu    schedule 24.10.2017
comment
вы можете использовать макрос, чтобы изменить внутреннюю реализацию named_mutex на мьютекс Windows или мьютекс posix, но у него также есть некоторые проблемы, вы можете просмотреть gitbub boost/interprocess, есть что-то обновленное, но последняя версия boost не объединяет его, вы должны изменить исходный код межпроцессного взаимодействия. или вы можете использовать только OS API - person Eric Xu; 17.12.2018