повысить межпроцессный с именем мьютекс остается приобретенным после сбоя - PullRequest
6 голосов
/ 18 октября 2011

Я использую 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 микросекунд? Здесь что-то не так в коде ниже?

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

AFG

Ответы [ 4 ]

4 голосов
/ 19 октября 2011

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

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

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

2 голосов
/ 18 августа 2015

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

2 голосов
/ 09 апреля 2015
boost::interprocess::named_mutex::remove( "MutexName" ); 

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

1 голос
/ 24 октября 2017

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

scoped_lock locker (mutex, abs_time);

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

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

...