Heim >Backend-Entwicklung >C++ >Wie verschiebe ich C-Typen, die „std::mutex' enthalten, sicher?
Umgang mit Mutexes in beweglichen C-Typen
Übersicht:
In C verbessert sich die Bewegungssemantik Effizienz, da Typen ohne Kopieren effizient verschoben werden können. Allerdings ist der Standard-Mutex (std::mutex) weder verschiebbar noch kopierbar, was eine Herausforderung für die Implementierung von verschiebungsfähigen Typen darstellt, die Mutexe nutzen.
Problem:
Wie kann eine Klasse (A), die einen Mutex enthält, in einem Thread-sicheren Modus beweglich gemacht werden? Art und Weise?
Lösung:
Um die Beweglichkeit zu ermöglichen, definieren Sie Sperrtypen (ReadLock und WriteLock) als Aliase für gemeinsame oder eindeutige Sperren. Verwenden Sie diese Typen, um den Mitgliedszugriff bei verschiebungsbezogenen Vorgängen zu schützen.
Verschiebekonstruktor:
A(A&& a) { WriteLock rhs_lk(a.mut_); field1_ = std::move(a.field1_); field2_ = std::move(a.field2_); }
Verschiebezuweisungsoperator:
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; }
Kopieren Konstruktor:
A(const A& a) { ReadLock rhs_lk(a.mut_); field1_ = a.field1_; field2_ = a.field2_; }
Kopierzuweisungsoperator:
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; }
Andere Überlegungen:
Das obige ist der detaillierte Inhalt vonWie verschiebe ich C-Typen, die „std::mutex' enthalten, sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!