2011-10-18 13 views
5

Używam boost::interpocess::scoped_lock przy użyciu named_mutex i timeout; Używam systemu operacyjnego Linux.Przyspiesz międzyprocesor o nazwie mutex zostaje nabyte po awarii

Podczas jednego z moich testów miałem awarię: od tego czasu za każdym razem, gdy próbuję uruchomić ponownie aplikację, utknął w punkcie, w którym utworzyłem zamek; wygląda na to, że muteks pozostał pozyskiwany w jakiś sposób (nie ma żadnego możliwego procesu z jego użyciem).

Co więcej, jeśli spojrzysz na poniższy kod, spodziewam się, że po 150 mikrosekundach czasowy scoped_lock powróci, aby podać mi błąd., Ale tak nie jest.

 #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; 
     } 
    .... 

Moje pytania są następujące:

  1. Jak upewnić się, że boost::interprocess nazwany mutex jest zniszczona? (jak wyświetlić wspólny mutex w procesach i jak je zniszczyć)
  2. Dlaczego nabycie muteksu nie powraca po 150 mikrosekund? Czy jest coś nie tak w poniższym kodzie?

Thanks a lot

AFG

Odpowiedz

4

znalazłem rozwiązanie: Brakowało mi zadzwonić następujące zniszczyć mutex

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

Ten kod robi czystą niezbędnych do góry.

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

To nie powinno być poprawne. To odblokuje muteks dla wszystkich innych procesów.

1

Nazwany mutex nie zostanie zwolniony po awarii w systemie Unix, spróbuj zamiast tego :: :: interprocess :: file_lock. Po wystąpieniu awarii blokada zostaje zwolniona.

+0

W moim przypadku pozostał on również nabyty w systemie Windows –

1

nie używaj funkcji local_time(), zamiast używać 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);

jeśli nastąpi awaria procesu, należy przechwycić sygnał awarii i odblokować named_mutex lub mieć wątek jako timer, aby sprawdzić martwy zamek i odblokować go.

użycie boost :: interprocess :: file_lock nowe problemy zostaną wprowadzone ostrożnie !!!

Powiązane problemy