"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > std::lock_guard vs. std::scoped_lock: ¿Cuándo elegir cuál?

std::lock_guard vs. std::scoped_lock: ¿Cuándo elegir cuál?

Publicado el 2024-11-08
Navegar:593

std::lock_guard vs. std::scoped_lock: When to Choose Which?

Contemplando std::lock_guard vs. std::scoped_lock

C 17 marcó la introducción de una nueva clase de bloqueo, std::scoped_lock , que comparte similitudes con el venerable std::lock_guard. Este artículo profundiza en las distinciones entre estos dos mecanismos de bloqueo y lo orienta en la elección de la herramienta óptima para sus necesidades específicas.

Cuándo utilizar std::lock_guard

Para En escenarios en los que se requiere el bloqueo de un único mutex para todo un alcance, std::lock_guard ofrece una API más segura que std::scoped_lock. Considere el siguiente ejemplo:

{
    std::scoped_lock lock;  // protect this block
    ...
}

Este fragmento genera inadvertidamente un error de tiempo de ejecución porque tiene un "comportamiento invisible". Parece compilarse sin problemas pero, en última instancia, no produce ningún bloqueo. La funcionalidad prevista probablemente sea necesaria:

{
    std::scoped_lock lock{mut};  // protect this block
    ...
}

Aclarar el mutex de destino para el bloqueo resuelve este problema. Por el contrario, emplear std::lock_guard evitaría que se compilara el primer ejemplo, lo que lo convertiría en un claro error en tiempo de compilación.

Cuándo utilizar std::scoped_lock

Cuándo Frente a situaciones en las que es necesario bloquear múltiples mutex, std::scoped_lock brilla. Por ejemplo:

{
    std::scoped_lock(lock1, lock2);  // protect this block
    ...
}

Este fragmento bloquea sucintamente dos mutex durante la duración del bloque.

Conclusión

Tanto std::lock_guard como std::scoped_lock atienden a escenarios distintos:

  • std::lock_guard para bloquear un único mutex en todo un alcance.
  • std::scoped_lock para bloquear múltiples mutex o para desbloquear dentro del alcance adjunto.

Si bien std::scoped_lock proporciona una funcionalidad más completa, std::lock_guard ofrece seguridad API mejorada en casos específicos. Considere cuidadosamente los requisitos de su código al seleccionar el enfoque más apropiado.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3