Heim > Backend-Entwicklung > C++ > Hauptteil

Ist std::shared_ptr wirklich threadsicher und was ist mit gleichzeitigen Änderungen am Objekt, auf das verwiesen wird?

Patricia Arquette
Freigeben: 2024-11-17 03:44:03
Original
475 Leute haben es durchsucht

Is std::shared_ptr truly thread-safe, and what about concurrent modifications to the pointed object?

Thread-Sicherheit von std::shared_ptr

Die Aussage, die Sie von MSDN bezüglich der Thread-Sicherheit von std::shared_ptr zitiert haben, kann falsch interpretiert werden. Dies bedeutet, dass zwar mehrere Threads gleichzeitig verschiedene shared_ptr-Objekte lesen und schreiben können, dies jedoch nicht die Sicherheit der Änderung des shared_ptr-Objekts selbst garantiert.

TL;DR:

Die Thread-Sicherheit von std::shared_ptr bezieht sich nur auf die Verwaltung mehrerer Zeiger, die auf dasselbe zugrunde liegende Objekt zeigen. Es erstreckt sich nicht auf den Inhalt des gemeinsam genutzten Objekts oder auf gleichzeitige Schreibvorgänge in der shared_ptr-Instanz.

Aufschlüsselung:

Ein shared_ptr besteht intern aus zwei Komponenten:

  • Kontrollblock: Verwaltet den Referenzzähler des shared_ptr und stellt die ordnungsgemäße Zerstörung des angezeigten Objekts sicher. Diese Komponente ist Thread-sicher.
  • Spitzes Objekt: Die tatsächliche Datenstruktur oder das Objekt, das gemeinsam genutzt wird. Die Thread-Sicherheit dieses Objekts hängt von seiner Implementierung ab.

Beispiel:

In Ihrem Codeausschnitt ist „global“ ein gemeinsamer Zeiger auf ein Konfigurationsobjekt. Thread 1 kopiert global in seinen eigenen gemeinsamen Zeiger, privat. Wenn Thread 2 anschließend „global“ ändern würde, würde „private“ immer noch auf das ursprüngliche Konfigurationsobjekt verweisen, da der Steuerblock nicht geändert wird. Wenn Thread 2 jedoch ein neues Konfigurationsobjekt global zuweist, würde privat weiterhin auf das ursprüngliche Objekt verweisen.

Thread-Sicherheit von spitzen Objekten:

Die Fähigkeit, sicher zu sein Das Ändern des Objekts, auf das verwiesen wird, über mehrere Threads hängt von der Implementierung des Objekts ab. Im Fall Ihrer Konfigurationsklasse wäre der Code nicht threadsicher, wenn sie gleichzeitige Schreibvorgänge ohne Synchronisierung zulässt, z. B. das Hinzufügen oder Entfernen von Einstellungen.

Lösung:

Um die Thread-Sicherheit für Objektänderungen zu gewährleisten, verwenden Sie Synchronisierungsmechanismen wie std::mutex, um den Zugriff auf das shared_ptr-Objekt oder das gemeinsam genutzte Objekt selbst zu schützen.

Das obige ist der detaillierte Inhalt vonIst std::shared_ptr wirklich threadsicher und was ist mit gleichzeitigen Änderungen am Objekt, auf das verwiesen wird?. 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