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
.