La différence est que vous pouvez verrouiller et déverrouiller a std::unique_lock
. std::lock_guard
sera verrouillé une seule fois lors de la construction et déverrouillé lors de la destruction.
Donc, pour le cas d'utilisation B, vous avez certainement besoin d'un std::unique_lock
pour la variable de condition. Dans le cas A, cela dépend si vous devez reverrouiller la garde.
std::unique_lock
a d'autres fonctionnalités qui lui permettent par exemple: d'être construit sans verrouiller le mutex immédiatement mais de construire le wrapper RAII (voir ici ).
std::lock_guard
fournit également un wrapper RAII pratique, mais ne peut pas verrouiller plusieurs mutex en toute sécurité. Il peut être utilisé lorsque vous avez besoin d'un wrapper pour une portée limitée, par exemple: une fonction membre:
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
};
Pour clarifier une question par chmike, par défaut std::lock_guard
et std::unique_lock
sont les mêmes. Donc, dans le cas ci-dessus, vous pouvez remplacer std::lock_guard
par std::unique_lock
. Cependant, std::unique_lock
pourrait avoir un peu plus de frais généraux.
Notez que ces jours-ci, il faut utiliser à la std::scoped_lock
place de std::lock_guard
.