Réponse tardive, et surtout en réponse à :
Vous pouvez envisager std::lock_guard
déprécié.
Pour le cas courant où l'on a besoin de verrouiller exactement un mutex, std::lock_guard
a une API qui est un peu plus sûre à utiliser que celle de scoped_lock
.
Par exemple :
{
std::scoped_lock lock; // protect this block
...
}
L'extrait ci-dessus est probablement une erreur d'exécution accidentelle car il compile et ne fait absolument rien. Le codeur voulait probablement dire :
{
std::scoped_lock lock{mut}; // protect this block
...
}
Maintenant il se verrouille/déverrouille mut
.
Si lock_guard
a été utilisé dans les deux exemples ci-dessus à la place, le premier exemple est une erreur de compilation au lieu d'une erreur d'exécution, et le second exemple a une fonctionnalité identique à la version qui utilise la fonction scoped_lock
.
Mon conseil est donc d'utiliser l'outil le plus simple pour le travail :
-
lock_guard
si vous avez besoin de verrouiller exactement 1 mutex pour une portée entière.
-
scoped_lock
si vous avez besoin de verrouiller un nombre de mutex qui n'est pas exactement 1.
-
unique_lock
si vous avez besoin de déverrouiller dans le cadre du bloc (ce qui inclut l'utilisation avec un bloc condition_variable
).
Ce conseil hace no impliquent que scoped_lock
devrait être redessiné pour ne pas accepter 0 mutex. Il existe des cas d'utilisation valables pour lesquels il est souhaitable que scoped_lock
pour accepter des paquets de paramètres de modèles variadiques qui peuvent être vides. Et le cas vide devrait no verrouiller quoi que ce soit.
Et c'est pourquoi lock_guard
n'est pas déprécié. scoped_lock
y unique_lock
peut être un sur-ensemble de la fonctionnalité de lock_guard
mais ce fait est une arme à double tranchant. Parfois, il est tout aussi important de savoir ce qu'un type ne le fera pas do (construction par défaut dans ce cas).