2011-10-18 10 views
5

Estoy usando un boost::interpocess::scoped_lock usando un named_mutex y un timeout; Me estoy ejecutando en el sistema operativo Linux.impulso interproceso llamado restos mutex adquiridos después de un bloqueo

Durante una de mis pruebas tuve un bloqueo: desde entonces, cada vez que trato de ejecutar nuevamente la aplicación, se atasca en el punto donde creé el bloqueo; parece que el mutex se mantuvo adquirido de alguna manera (no se está ejecutando ningún proceso posible).

Además de eso, si mira el siguiente código, espero que después de 150 microsegundos, el scoped_lock temporizado vuelva a darme un error ... pero este no es el caso ... simplemente se cuelga allí.

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

Mis preguntas son las siguientes:

  1. Cómo asegurarse de que boost::interprocess mutex llamado se destruye? (Entonces, ¿cómo ver el mutex compartido en los procesos y cómo destruirlos?
  2. ¿Por qué adquirir el mutex no regresa después de 150 microsegundos? ¿Hay algo mal en el código a continuación?

Muchas gracias

AFG

Respuesta

4

he encontrado la solución: me perdí a llamar al siguiente para destruir el mutex

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

Este código hace que toda la limpieza necesaria para arriba.

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

Esto no debería ser correcto. Esto desbloqueará el mutex para todos los demás procesos, también.

1

El mutex con nombre no se lanzará cuando falle en Unix, pruebe boost :: interprocess :: file_lock en su lugar. Cuando se produce un bloqueo, se libera el bloqueo.

+0

En mi caso, se mantuvo adquirido en Windows también –

1

no utiliza la función LOCAL_TIME(), en lugar de utilizar universal_time(): impulso :: posix_time :: ptime abs_time = impulsar :: posix_time :: microsec_clock :: universal_time() + boost :: posix_time :: milisegundos (150);

scoped_lock locker (mutex, abs_time);

Si se produce un fallo del proceso, debe capturar la señal de bloqueo y desbloquear el named_mutex o tener un hilo como temporizador para comprobar el bloqueo muerto y desbloquearlo.

usando boost :: interprocess :: file_lock se introducirán nuevos problemas, con cuidado!

Cuestiones relacionadas