tutorial threads thread libreria library how ejemplo algorithms c++ multithreading c++11

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.