Heim > Backend-Entwicklung > C++ > Wie erstelle ich einen beweglichen Typ mit internen Mutexes in C?

Wie erstelle ich einen beweglichen Typ mit internen Mutexes in C?

Linda Hamilton
Freigeben: 2024-12-05 11:01:11
Original
782 Leute haben es durchsucht

How to Make a Movable Type with Internal Mutexes in C  ?

Umgang mit Mutexes in beweglichen Typen in C

Wie Sie erwähnt haben, ist std::mutex weder beweglich noch kopierbar, was eine Herausforderung darstellt, wenn Arbeiten mit Klassen, die Mutexe enthalten. Um einen Typ verschiebbar zu machen und gleichzeitig die Thread-Sicherheit aufrechtzuerhalten, ziehen Sie den folgenden Ansatz in Betracht:

Verschiebekonstruktor

Erstellen Sie einen Verschiebungskonstruktor, der den Mutex des Objekts, das von (a) verschoben wird, mithilfe eines WriteLock sperrt:

A(A&& a) {
  WriteLock rhs_lk(a.mut_);
  field1_ = std::move(a.field1_);
  field2_ = std::move(a.field2_);
}
Nach dem Login kopieren

Verschiebezuweisung

Der Verschiebungszuweisungsoperator ist schwieriger, da möglicherweise andere Threads darauf zugreifen entweder die linke oder die rechte Seite der Zuweisung:

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;
}
Nach dem Login kopieren

Kopierkonstruktor

Wenn Sie die Kopiersemantik unterstützen müssen, erstellen Sie einen Kopierkonstruktor, der den Mutex des Objekts sperrt, von dem kopiert wird (a ) mit einem ReadLock:

A(const A& a) {
  ReadLock rhs_lk(a.mut_);
  field1_ = a.field1_;
  field2_ = a.field2_;
}
Nach dem Login kopieren

Aufgabe kopieren

Wenn Sie auch eine Kopieraufgabe benötigen Operator, folgen Sie einem ähnlichen Muster:

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;
}
Nach dem Login kopieren

Zusätzliche Hinweise

Der Schutz von Mitgliedern und freien Funktionen, die auf den Status der Klasse zugreifen, ist für die Thread-Sicherheit von entscheidender Bedeutung. Hier ist zum Beispiel eine Swap-Funktion:

friend void swap(A& x, A& y) {
  if (&x != &y) {
    WriteLock lhs_lk(x.mut_, std::defer_lock);
    WriteLock rhs_lk(y.mut_, std::defer_lock);
    std::lock(lhs_lk, rhs_lk);
    using std::swap;
    swap(x.field1_, y.field1_);
    swap(x.field2_, y.field2_);
  }
}
Nach dem Login kopieren

Zuletzt erinnern wir uns daran, dass std::shared_timed_mutex in C 14 mögliche Optimierungen in Situationen ermöglicht, in denen mehrere Threads versuchen, aus demselben Objekt eine Kopie zu erstellen.

Das obige ist der detaillierte Inhalt vonWie erstelle ich einen beweglichen Typ mit internen Mutexes in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage