lock_guard
può essere implementato con un'unità di stato: un puntatore o un riferimento al tipo Mutex
bloccato.
unique_lock
deve entrambi sostengono che lo stato, e sapendo se è attualmente bloccato, come unique_lock
può avere un Mutex
che non è bloccato. Ciò significa che deve avere almeno uno bool
di stato aggiuntivo.
lock_guard
fornisce un nullo sovraccarico RAII blocco/sblocco involucro intorno acquisire e rilasciare un Mutex
. Fondamentalmente il lock_guard
significa che non vi è alcun motivo per evitare l'uso di RAII per gestire i blocchi su un Mutex
.
può raggiungere zero spese generali se il compilatore può essere convinto di notare che è possibile utilizzarlo solo in modi che è possibile utilizzare lock_guard
(cioè, costruirlo, quindi distruggerlo, senza armeggiare con esso).
Oltre a questi argomenti di efficienza, un programmatore che vede un lock_guard
sa che durerà fino alla fine dell'ambito senza dover esaminare il codice nell'ambito. Un programmatore che vede un unique_lock
deve esaminare tutto l'uso della variabile per sapere se questo è il caso.
Ma quanto sopra è solo metà del motivo.
L'altra metà del motivo è perché gran parte della libreria di threading per C++ 11 era basata su librerie boost
, che avevano già implementato una libreria di threading per lo più indipendente dalla piattaforma. Boost ha sia lock_guard
e unique_lock
, con semantica quasi identica alle versioni C++ 11.
Così, quando la libreria di threading boost
era standardizzata, entrambi sono stati trasportati e nessuno li ha eliminati.