Thread-sichere Beweglichkeit mit nicht beweglichen Mutexes in C
Beim Umgang mit beweglichen Typen wie std::mutex in C Thread-sichere Programmierung kann eine Herausforderung sein. Standardmäßig ist std::mutex weder verschiebbar noch kopierbar, was die Erstellung Thread-sicherer beweglicher Objekte behindert.
Um eine Klasse, die einen Mutex enthält, verschiebbar zu machen und die Thread-Sicherheit aufrechtzuerhalten, sollten Sie den folgenden Ansatz in Betracht ziehen:
1. Veränderlichkeit aktivieren:
Machen Sie das Mutex-Mitglied veränderbar (z. B. mutable std::mutex mut_;), um Änderungen während Verschiebungsvorgängen zu ermöglichen.
2. Konstruktor verschieben:
Sperren Sie den Mutex des Objekts, von dem verschoben wird, bevor Sie seine Mitglieder zuweisen. Dadurch wird eine Datenbeschädigung durch gleichzeitigen Zugriff verhindert.
A(A&& a) { WriteLock rhs_lk(a.mut_); field1_ = std::move(a.field1_); field2_ = std::move(a.field2_); }
3. Verschiebungszuweisungsoperator:
Schützen Sie die Verschiebungszuweisung mithilfe von Synchronisierungsprimitiven. Da der Zugriff von mehreren Threads aus möglich ist, sperren Sie sowohl die linken (lhs) als auch die rechten (rhs) Mutexe, bevor Sie Zuweisungen durchführen.
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; }
4. Kopiermitglieder (optional):
Wenn auch Kopiermitglieder erforderlich sind, verwenden Sie ReadLock (anstelle von WriteLock), um gleichzeitiges Lesen aus dem Objekt zu ermöglichen, von dem kopiert wird.
A(const A& a) { ReadLock rhs_lk(a.mut_); field1_ = a.field1_; field2_ = a.field2_; }
5 . Zusätzliche Überlegungen:
Durch Befolgen dieser Richtlinien können Sie dies sicherstellen dass Ihre beweglichen Klassen auch bei Verwendung nicht beweglicher Mutexe threadsicher bleiben.
Das obige ist der detaillierte Inhalt vonWie kann ich meine C-Klassen mit nicht beweglichen Mutexes sowohl beweglich als auch threadsicher machen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!