2015-11-29 16 views
8

C'è un modo che posso dire std::lock_gaurd per chiamare try_lock invece di lock quando acquisisce il mutex?Utilizzare std :: lock_guard con try_lock

L'unico modo che ho potuto pensare è quello di utilizzare std::adopt_lock:

if (!_mutex.try_lock()) 
{ 
    // Handle failure and return from the function 
} 
std::lock_guard<my_mutex_class> lock(_mutex, std::adopt_lock); 

C'è una soluzione integrata per il mio problema piuttosto che l'acquisizione del blocco in modo esplicito e poi dare lock_guard la responsabilità di rilasciarlo?

+0

Sono abbastanza sicuro che è la soluzione integrata che si sta già utilizzando. – user2079303

risposta

22

Un invariante di base di lock_guard è che mantiene sempre il blocco. Ciò minimizza il sovraccarico dal momento che il suo distruttore può chiamare incondizionatamente unlock() e non deve memorizzare altro stato.

Se è necessario il comportamento try-to-lock, utilizzare unique_lock:

std::unique_lock<std::mutex> lock(_mutex, std::try_to_lock); 
if(!lock.owns_lock()){ 
    // mutex wasn't locked. Handle it. 
} 
Problemi correlati