2011-12-30 9 views
9

Qualcuno sa come controllare e vedere se un QMutex è bloccato, senza utilizzare la funzione di:Come si può sapere se un QMutex è bloccato o no?

bool QMutex::tryLock()

Il motivo per cui non voglio usare tryLock() è perché fa due cose:

  1. Controllare e vedere se il mutex è bloccato.
  2. Se non è bloccato, bloccarlo.

Per i miei scopi, non sono interessato a eseguire questo secondo passaggio (bloccando il mutex).

Voglio solo sapere se è bloccato o meno.

+1

Perché bloccare da :: tryLock ti disturba? Puoi sbloccarlo subito dopo aver ottenuto il blocco.] –

risposta

5

OK, immagino che non ci sia un modo reale di fare quello che sto chiedendo senza usare effettivamente tryLock().

Ciò potrebbe essere realizzato con il seguente codice:

bool is_locked = true; 

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

if(is_locked) 
{ 
    ... 
} 

Come si può vedere, si sblocca il QMutex, "a_mutex", se fosse in grado di bloccarlo.

Naturalmente, questa non è una soluzione perfetta, poiché quando raggiunge la seconda istruzione if, lo stato del mutex potrebbe essere cambiato.

21

Provare a bloccare un mutex è per definizione l'unico modo per dire se è bloccato; altrimenti, quando questa funzione immaginaria è tornata, come faresti a sapere se il mutex era ancora bloccato? Potrebbe essere diventato sbloccato mentre la funzione stava tornando; o, ancora più importante, senza eseguire tutto il lavaggio e la sincronizzazione della cache necessari per bloccarlo, in realtà non si poteva essere sicuri che fosse bloccato o meno.

+1

Ottima risposta! –

+3

-1 Piccola nota, a volte è utile sapere se il mutex è bloccato senza tentare di bloccarlo, ad esempio per scopi statistici mentre ancora senza interferire con i thread. Quindi, nonostante il tuo punto importante, non è "per definizione l'unico modo per dire se è bloccato" – Artyom

+2

Er, che qualcosa sarebbe utile non implica che non sia impossibile per definizione. – Hurkyl

4

Forse un QSemaphore con un permesso? Il metodo available() può darti quello che ti serve.

1

QMutex è progettato solo per funzionalità di blocco e sblocco. La raccolta di statistiche può essere soddisfatta con alcuni contatori personalizzati.
Prova QSemaphore come @Luca Carion menzionata in precedenza.

Problemi correlati