Heim >Backend-Entwicklung >C++ >Wie implementiert man Thread-sichere Bewegungssemantik für Klassen, die Mutexe enthalten?
Problem:
Standardbibliotheks-Mutexe (std::mutex) sind weder kopierbar noch verschiebbar, was dazu führt, dass für Klassen, die Mutexe enthalten, keine standardmäßigen Verschiebungskonstruktoren vorhanden sind. Dies stellt eine Herausforderung für die Thread-sichere Erzielung beweglicher Typen dar.
Lösung:
Um eine Klasse, die einen Mutex enthält, beweglich zu machen und gleichzeitig die Thread-Sicherheit sicherzustellen, gehen Sie wie folgt vor Schritte können unternommen werden:
class A { using MutexType = std::mutex; using ReadLock = std::unique_lock<MutexType>; using WriteLock = std::unique_lock<MutexType>; mutable MutexType mut_; // Other member variables... };
Umzug Konstruktor:
A(A&& a) { WriteLock rhs_lk(a.mut_); // Copy or move member variables under rhs_lk protection. }
Zuweisung verschieben:
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); // Copy or move member variables under combined lock. } return *this; }
Konstruktor kopieren:
A(const A& a) { ReadLock rhs_lk(a.mut_); // Copy member variables under rhs_lk protection. }
Kopieren Zuweisung:
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); // Copy member variables under combined lock. } return *this; }
Diese threadsicheren Verschiebungs- und Kopiervorgänge bewahren die Integrität des Mutex und ermöglichen eine zuverlässige Änderung und Zugriff auf Mitgliedsvariablen unter Sperrschutz.
Das obige ist der detaillierte Inhalt vonWie implementiert man Thread-sichere Bewegungssemantik für Klassen, die Mutexe enthalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!