web-dev-qa-db-fra.com

mutex.lock vs unique_lock

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.

31
Morgan Fouque

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.

30
gbehar

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
}
9
Richard Hodges