Gestion des mutex dans les types mobiles en C
Problème :
En raison du non- nature copiable et non mobile de std::mutex, les classes contenant des mutex manquent de constructeurs de déplacement par défaut, ce qui rend difficile la créer des types thread-safe mobiles.
Solution :
Pour obtenir une sémantique de déplacement thread-safe pour la classe A contenant un mutex, adoptez les stratégies suivantes :
Constructeur de déplacement :
A(A&& a) { WriteLock rhs_lk(a.mut_); // Lock the rhs mutex field1_ = std::move(a.field1_); // Move the data field2_ = std::move(a.field2_); }
Affectation de déplacement Opérateur :
A& operator=(A&& a) { if (this != &a) { WriteLock lhs_lk(mut_, std::defer_lock); WriteLock rhs_lk(a.mut_, std::defer_lock); std::lock(lhs_lk, rhs_lk); field1_ = std::move(a.field1_); field2_ = std::move(a.field2_); } return *this; }
Constructeur de copie :
A(const A& a) { ReadLock rhs_lk(a.mut_); // Lock the rhs mutex for reading field1_ = a.field1_; // Copy the data field2_ = a.field2_; }
Opérateur d'affectation de copie :
A& operator=(const A& a) { if (this != &a) { WriteLock lhs_lk(mut_, std::defer_lock); ReadLock rhs_lk(a.mut_, std::defer_lock); std::lock(lhs_lk, rhs_lk); field1_ = a.field1_; field2_ = a.field2_; } return *this; }
Autre Considérations :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!