c++ concurrency locking mutex

c++ - mutex.lock vs unique_lock



mutex c++ (2)

¿Cuándo debería preferir la primera parte del código a la segunda, y tienen diferencias fundamentales?

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

y

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

Entiendo que lock_guard es básicamente un unique_lock sin las funciones de bloqueo y desbloqueo, pero estoy teniendo dificultades para diferenciar un mutex y un bloqueo utilizando un mutex.


Piénsalo de esta manera:

// define a mutex std::mutex mtx;

... mucho más tarde ...

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 }


Sí, las llamadas std::unique_lock se desbloquean en el mutex en su destructor.

El beneficio de esto es que, en caso de que se produzca alguna excepción, está seguro de que el mutex se desbloqueará al dejar el ámbito donde se define std::unique_lock .