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:
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!