Umgang mit Mutexes in beweglichen Typen in C
Problem:
Aufgrund der Nicht- Aufgrund der kopierbaren und nicht verschiebbaren Natur von std::mutex fehlen Klassen, die Mutexe enthalten, standardmäßige Verschiebungskonstruktoren, was es zu einer Herausforderung macht um verschiebbare Thread-sichere Typen zu erstellen.
Lösung:
Um eine Thread-sichere Bewegungssemantik für Klasse A mit einem Mutex zu erreichen, übernehmen Sie die folgenden Strategien:
Move-Konstruktor:
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_); }
Move-Zuweisung Operator:
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; }
Kopierkonstruktor:
A(const A& a) { ReadLock rhs_lk(a.mut_); // Lock the rhs mutex for reading field1_ = a.field1_; // Copy the data 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 kann ich meine C-Klasse mit einem Mutex beweglich und threadsicher machen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!