Heim  >  Artikel  >  Backend-Entwicklung  >  Ist std::shared_ptr threadsicher für das Objekt, das es verwaltet?

Ist std::shared_ptr threadsicher für das Objekt, das es verwaltet?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-15 13:03:02257Durchsuche

Is std::shared_ptr thread-safe for the object it manages?

Inwieweit gewährleistet std::shared_ptr Thread-Sicherheit?

Ursprüngliche Fragen:

  1. Referenz Das Zählen in std::shared_ptr ist garantiert threadsicher und plattformunabhängig.
  2. Nur ​​der Thread, der die letzte Referenz enthält, ruft delete für das freigegebene Objekt auf.
  3. std::shared_ptr tut dies Bietet keine Thread-Sicherheit für das gespeicherte Objekt.

Antworten:

Ja, die ersten beiden Fragen sind korrekt. Die Referenzzählung und der Destruktoraufruf von std::shared_ptr sind threadsicher.

Die dritte Frage ist ebenfalls richtig. std::shared_ptr garantiert keine Thread-Sicherheit für das darin gespeicherte Objekt. Das Objekt selbst ist möglicherweise nicht threadsicher und daher kann der Zugriff von mehreren Threads ohne ordnungsgemäße Synchronisierung zu undefiniertem Verhalten führen.

Beispiel:

Bedenken Sie Folgendes Stück Pseudocode:

// Thread I
shared_ptr<A> a (new A (1));

// Thread II
shared_ptr<A> b (a);

// Thread III
shared_ptr<A> c (a);

// Thread IV
shared_ptr<A> d (a);

d.reset (new A (10));
  • Frage: Löscht der Aufruf von reset() in Thread IV die vorherige Instanz von A, die in Thread I erstellt wurde, und ersetzt sie durch eine neue Instanz?
  • Antwort:Nein, nur d zeigt auf das neue A(10), während a, b und c weiterhin auf das ursprüngliche A(1) zeigen.

Das liegt daran, dass reset() keinen Einfluss auf die Verweise anderer Threads auf dasselbe Objekt hat. d ist der einzige gemeinsame Zeiger, der auf die neue Instanz zeigt, während die anderen Referenzen (a, b und c) weiterhin auf die ursprüngliche Instanz zeigen.

Das obige ist der detaillierte Inhalt vonIst std::shared_ptr threadsicher für das Objekt, das es verwaltet?. 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