2016-06-21 26 views
16

Quando devo preferire il primo pezzo di codice al secondo, e fare hanno differenze fondamentalimutex.lock vs unique_lock

std::mutex mtx; 
mtx.lock(); 
... //protected stuff 
mtx.unlock(); 
... //non-protected stuff 
mtx.lock(); 
... //etc 

e

std::mutex mtx; 
std::unique_lock<std::mutex> lck(mtx); 
... //protected stuff 
lck.unlock(); 
... //non-protected stuff 
lck.lock(); 
... //etc 

Capisco che è fondamentalmente un lock_guard unique_lock senza le funzioni di blocco e sblocco, ma sto facendo fatica a differenziare un mutex e un lock usando un mutex.

+0

altamente correlati: http://stackoverflow.com/questions/22873082/is-there- any-idiomatic-explicit-use-of-mutexlock-or-unlock – NathanOliver

risposta

18

Sì, le chiamate std::unique_lock si sbloccano sul mutex nel suo distruttore.

Il vantaggio di ciò è che nel caso in cui venga generata un'eccezione, si è certi che il mutex si sbloccherà quando si lascia l'ambito in cui è definito lo std::unique_lock.

+0

Quindi non è consigliabile utilizzare il mutex semplice, in quanto un'eccezione potrebbe causare problemi con i blocchi, che unique_lock impedisce? –

+1

Se il codice all'interno del blocco può generare un'eccezione, allora sì. Se si blocca una volta sola e si sblocca alla fine, anche std :: lock_guard eseguirà il lavoro, ed è più semplice di std :: unique_lock – gbehar

5

pensare in questo modo:

// define a mutex 
std::mutex mtx; 

... molto più tardi ...

void something_safe() 
{ 

    // code in these braces is a critical section 
    { 
    auto lock = std::unique_lock<std::mutex>(mtx); // equivalent to mtx.lock(); 
    ... //protected stuff 
    } // <---- however you leave this brace, equivalent to mtx.unlock(); 

    ... //non-protected stuff 
} 
+1

questo non risolve nessuna delle domande poste. –

+0

La coda di modifica per questo post è piena, ma essenzialmente ciò che Richard sta cercando di ottenere è con un unique_lock che non è necessario sbloccare esplicitamente il mutex - si sblocca quando l'oggetto unique_lock esce dall'ambito. –

Problemi correlati