2011-12-30 18 views
9

¿Alguien sabe cómo comprobar y ver si un QMutex está bloqueado, sin utilizar la función:¿Cómo se puede saber si un QMutex está bloqueado o no?

bool QMutex::tryLock()

La razón por la que no quiero utilizar trylock() se debe a que hace dos cosas:

  1. Compruebe y verifique si el mutex está bloqueado.
  2. Si no está bloqueado, ciérrelo.

Para mis propósitos, no estoy interesado en realizar este segundo paso (bloquear el mutex).

Solo quiero saber si está bloqueado o no.

+1

¿Por qué bloquear por :: tryLock te molesta? Puede desbloquearlo justo después de obtener el bloqueo.] –

Respuesta

5

OK, supongo que no hay una manera real de hacer lo que estoy pidiendo sin usar realmente tryLock().

Esto podría lograrse con el siguiente código:

bool is_locked = true; 

if(a_mutex.tryLock()) 
{ 
    a_mutex.unlock(); 
    is_locked = false; 
} 

if(is_locked) 
{ 
    ... 
} 

Como se puede ver, se desbloquea el QMutex, "a_mutex", si era capaz de bloquearlo.

Por supuesto, esta no es una solución perfecta, ya que para el momento en que llegue a la segunda instrucción if, el estado del mutex podría haber cambiado.

21

Intentar bloquear un mutex es, por definición, la única manera de saber si está bloqueado; de lo contrario, cuando devuelva esta función imaginaria, ¿cómo sabría si el mutex estaba todavía bloqueado? Puede haberse desbloqueado mientras la función estaba regresando; o más importante, sin realizar todo el cache-flushing y la sincronización necesaria para bloquearlo, no se puede estar seguro de si está bloqueado o no.

+1

¡Muy buena respuesta! –

+3

-1 Nota pequeña, a veces es útil saber si el mutex está bloqueado sin intentar bloquearlo, por ejemplo con fines estadísticos sin interferir con los hilos. Entonces, a pesar de su punto importante, no es "por definición, la única forma de saber si está bloqueado" – Artyom

+2

Er, que algo sea útil no implica que no sea imposible por definición. – Hurkyl

4

¿Quizás un QSemaphore con un permiso? El método disponible() puede darle lo que necesita.

1

QMutex está diseñado solo para bloquear y desbloquear la funcionalidad. Las estadísticas de recopilación pueden ser satisfechas con algunos contadores personalizados.
Pruebe QSemaphore como @Luca Carion mencionado anteriormente.

Cuestiones relacionadas