Quelle est la meilleure façon de verrouiller plusieurs std :: mutex?

Note: Cette question concerne C ++ 11. La réponse à la même question en C ++ 17 (ou versions ultérieures) peut avoir changé. Pour plus de détails:

  • std :: lock_guard ou std :: scoped_lock?

Lorsque nous voulons verrouiller plusieurs std::mutex , nous utilisons std::lock() . Mais std::lock() ne fournit pas de fonctionnalité RAII.

Lorsque nous voulons verrouiller un std::mutex de manière RAII, nous utilisons std::lock_guard . Mais std::lock_guard ne peut pas verrouiller plusieurs std::lock_guard std::mutex toute sécurité.

Est-il possible de tirer parti des deux méthodes pour verrouiller plusieurs std::mutex de manière RAII?

Oui, vous pouvez utiliser un std::unique_lock avec std::defer_lock . Il indique à unique_lock de ne pas verrouiller le mutex immédiatement, mais de construire le wrapper RAII.

 std::unique_lock lk1(mutex1, std::defer_lock); std::unique_lock lk2(mutex2, std::defer_lock); std::lock(lk1, lk2); 

En raison de sa nature variad std::lock n’est pas lié à deux arguments, mais peut être utilisé avec autant d’arguments que le supporte votre compilateur.

Howard Hinnant a également souligné un fait intéressant sur la performance, vous pouvez vérifier ce lien si vous êtes intéressé. Il aborde les problèmes de performances et montre que std::lock peut être implémenté efficacement, je peux également vous recommander de lire tous les commentaires de cet article.