Gestion des mutex dans les types C mobiles
Présentation :
En C, la sémantique de déplacement est améliorée efficacité en permettant aux types d'être déplacés efficacement sans copie. Cependant, le mutex standard (std::mutex) n'est ni mobile ni copiable, ce qui pose un défi pour la mise en œuvre de types activés par le déplacement qui exploitent les mutex.
Problème :
Comment une classe (A) contenant un mutex peut-elle être rendue mobile dans un environnement thread-safe manière ?
Solution :
Pour activer la mobilité, définissez les types de verrous (ReadLock et WriteLock) comme alias pour les verrous partagés ou uniques. Utilisez ces types pour protéger les accès des membres dans les opérations liées au déplacement.
Constructeur de déplacement :
A(A&& a) { WriteLock rhs_lk(a.mut_); field1_ = std::move(a.field1_); field2_ = std::move(a.field2_); }
Opérateur d'affectation de déplacement :
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; }
Copie Constructeur :
A(const A& a) { ReadLock rhs_lk(a.mut_); field1_ = a.field1_; 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; }
Autres 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!