57 votes

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

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

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

Existe-t-il un moyen de profiter des avantages des deux méthodes, de verrouiller plusieurs std::mutex de manière RAII?

93voto

bamboon Points 7089

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

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

En raison de sa variadic nature std::lock n'est pas liée à seulement deux arguments mais peut être utilisé avec autant d'arguments que votre compilateur prend en charge.

Howard Hinnant également souligné un fait intéressant sur les performances, vous pouvez consulter ce lien si vous êtes intéressés. Il aborde les problèmes de performances et montre qu' std::lock peut être mis en œuvre de manière efficace, je peux vous conseillons également de lire tous les commentaires de ce post.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X