2011-10-18 15 views
5

Sto utilizzando un boost::interpocess::scoped_lock utilizzando un named_mutex e un timeout; Sono in esecuzione su Linux OS.boost interprocesso denominato mutex rimane acquisito dopo un crash

Durante uno dei miei test ho avuto un crash: da allora, ogni volta che provo a eseguire nuovamente l'applicazione, si blocca sul punto in cui ho creato il blocco; sembra che il mutex sia rimasto acquisito in qualche modo (non è possibile eseguire nessun processo usando questo).

Inoltre, se si guarda il codice seguente, mi aspetto che dopo 150 microsecondi, il tempo scoped_lock ritorni per darmi un errore..ma questo non è il caso.è appeso solo lì.

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

Le mie domande sono le seguenti:

  1. Come assicurarsi che boost::interprocess nome mutex viene distrutto? (così come vedere il mutex condiviso attraverso i processi e come distruggerli)
  2. Perché l'acquisizione del mutex non ritorna dopo 150 microsecondi? C'è qualcosa di sbagliato nel codice qui sotto?

Grazie mille

AFG

risposta

4

ho trovato la soluzione: ho perso di chiamare il seguente di distruggere il mutex

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

Questo codice fa tutta la necessaria pulizia.

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

Questo non dovrebbe essere corretto. Questo sbloccherà il mutex anche per tutti gli altri processi.

1

Il mutex con nome non verrà rilasciato in caso di arresto anomalo su unix, provare invece boost :: interprocess :: file_lock. Quando si verifica un arresto anomalo, il blocco viene rilasciato.

+0

Nel mio caso è rimasto acquisito anche su Windows –

1

non utilizzare la funzione LOCAL_TIME(), invece di utilizzare universal_time(): boost :: :: posix_time ptime abs_time = boost :: posix_time :: :: microsec_clock universal_time() + boost :: :: posix_time millisecondi (150);

locked_lock locker (mutex, abs_time);

se il processo si blocca, è necessario acquisire il segnale di arresto anomalo e sbloccare il named_mutex o disporre di un thread come timer per controllare il deadlock e sbloccarlo.

utilizzando boost :: interprocess :: file_lock verranno introdotti nuovi problemi, con attenzione !!!