Quand devrais-je préférer le premier morceau de code au second, et ont-ils des différences fondamentales
std::mutex mtx;
mtx.lock();
... //protected stuff
mtx.unlock();
... //non-protected stuff
mtx.lock();
... //etc
et
std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx);
... //protected stuff
lck.unlock();
... //non-protected stuff
lck.lock();
... //etc
Je comprends que lock_guard est fondamentalement un unique_lock sans les fonctions de verrouillage et de déverrouillage, mais j'ai du mal à différencier un mutex et un verrou à l'aide d'un mutex.
Oui le std::unique_lock
appelle le déverrouillage sur le mutex dans son destructeur.
L'avantage de ceci est que si une exception est levée, vous êtes sûr que le mutex se déverrouillera en quittant la portée où le std::unique_lock
est défini.
Pense-y de cette façon:
// define a mutex
std::mutex mtx;
... beaucoup plus tard ...
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
}