Heim >Backend-Entwicklung >C++ >Wie kann ich meine C-Klasse mit einem Mutex beweglich und threadsicher machen?

Wie kann ich meine C-Klasse mit einem Mutex beweglich und threadsicher machen?

Susan Sarandon
Susan SarandonOriginal
2024-11-29 06:05:14612Durchsuche

How Can I Make My C   Class with a Mutex Movable and Thread-Safe?

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:

  • Definieren Sie der Einfachheit halber einen ReadLock- und WriteLock-Typalias.
  • Denken Sie daran, beide Mutexe mit std::lock für den Verschiebungszuweisungsoperator zu sperren, um einen Deadlock zu vermeiden.
  • Erwägen Sie die Verwendung von std::shared_timed_mutex in C 14, um Parallelität zu ermöglichen liest.
  • Schützen Sie alle Mitgliedsfunktionen oder freien Funktionen, die auf den internen Zustand der Klasse A zugreifen, mithilfe der entsprechenden Mutex-Sperren.
  • Fügen Sie bei Bedarf Datenmitgliedssperren hinzu, um ReadLock- und WriteLock-Objekte zu speichern, um einen Ausfall zu vermeiden Erstellen von Mitgliedern während des Kopierens.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn