La diferencia es que puedes bloquear y desbloquear a std::unique_lock
. std::lock_guard
será bloqueado solo una vez en construcción y desbloqueado en destrucción.
Entonces, para el caso de uso B, definitivamente necesita un std::unique_lock
para la variable de condición. En el caso A, depende de si necesita volver a bloquear la guardia.
std::unique_lock
tiene otras características que le permiten, por ejemplo: construirse sin bloquear el mutex inmediatamente, pero construir el contenedor RAII (ver aquí ).
std::lock_guard
también proporciona un conveniente contenedor RAII, pero no puede bloquear múltiples mutexes de manera segura. Se puede usar cuando necesita un contenedor para un alcance limitado, por ejemplo: una función miembro:
class MyClass{
std::mutex my_mutex;
void member_foo() {
std::lock_guard<mutex_type> lock(this->my_mutex);
/*
block of code which needs mutual exclusion (e.g. open the same
file in multiple threads).
*/
//mutex is automatically released when lock goes out of scope
};
Para aclarar una pregunta por chmike, por defecto std::lock_guard
y std::unique_lock
son lo mismo. Entonces, en el caso anterior, podría reemplazar std::lock_guard
con std::unique_lock
. Sin embargo, std::unique_lock
podría tener un poco más de gastos generales.
Tenga en cuenta que en estos días se debe usar en std::scoped_lock
lugar de std::lock_guard
.