c++ - threads - ¿Cuál es la mejor manera de bloquear múltiples std:: mutex''es?
thread library c++ (1)
Nota: esta pregunta se refiere a C ++ 11. La respuesta a la misma pregunta en C ++ 17 (o revisiones posteriores) puede haber cambiado. Para detalles:
Cuando queremos bloquear múltiples std::mutex
''es, usamos std::lock()
. Pero std::lock()
no proporciona la función RAII.
Cuando queremos bloquear un std::mutex
en RAII, usamos std::lock_guard
. Pero std::lock_guard
no puede bloquear múltiples std::mutex
''es de forma segura.
¿Hay alguna forma de aprovechar las ventajas de ambos métodos para bloquear múltiples std::mutex
''es en modo RAII?
Sí, puede usar std::unique_lock
con std::defer_lock
. Le dice al unique_lock que no bloquee el mutex inmediatamente, sino que construya el wrapper RAII.
std::unique_lock<std::mutex> lk1(mutex1, std::defer_lock);
std::unique_lock<std::mutex> lk2(mutex2, std::defer_lock);
std::lock(lk1, lk2);
Debido a su naturaleza variada, std::lock
no está limitado solo a dos argumentos, sino que se puede usar con tantos argumentos como admita su compilador.
Howard Hinnant también señaló un hecho interesante sobre el rendimiento, puede consultar this enlace si está interesado. Se ocupa de las preocupaciones de rendimiento y muestra que std::lock
se puede implementar de manera eficiente, también puedo recomendar leer todos los comentarios en esa publicación.