Rumah >pembangunan bahagian belakang >C++ >Adakah std::shared_ptr thread-selamat untuk objek yang diurusnya?

Adakah std::shared_ptr thread-selamat untuk objek yang diurusnya?

Patricia Arquette
Patricia Arquetteasal
2024-11-15 13:03:02365semak imbas

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

Sejauh manakah std::shared_ptr memastikan keselamatan benang?

Soalan Asal:

  1. Rujukan mengira dalam std::shared_ptr dijamin selamat untuk benang dan bebas platform.
  2. Hanya utas yang memegang rujukan terakhir akan memanggil padam pada objek kongsi.
  3. std::shared_ptr melakukan tidak menyediakan sebarang keselamatan benang untuk objek yang disimpannya.

Jawapan:

Ya, dua soalan pertama adalah tepat. std::shared_ptr's reference counting and destructor invocation adalah thread-safe.

Soalan ketiga juga betul. std::shared_ptr tidak menjamin keselamatan benang untuk objek yang disimpan di dalamnya. Objek itu sendiri mungkin tidak selamat untuk benang, dan oleh itu, mengaksesnya daripada berbilang rangkaian tanpa penyegerakan yang betul boleh membawa kepada gelagat yang tidak ditentukan.

Contoh:

Pertimbangkan perkara berikut sekeping pseudokod:

// 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));
  • Soalan: Adakah panggilan reset() dalam Thread IV akan memadamkan contoh sebelumnya A yang dibuat dalam Thread I dan menggantikannya dengan tika baharu?
  • Jawapan: Tidak, hanya d akan menunjuk ke A(10) baharu, manakala a, b, dan c akan terus menunjuk ke A(1 asal).

Ini kerana reset() tidak menjejaskan rujukan benang lain kepada objek yang sama. d ialah satu-satunya penuding kongsi yang akan menunjuk kepada tika baharu, manakala rujukan lain (a, b dan c) akan kekal menunjuk kepada tika asal.

Atas ialah kandungan terperinci Adakah std::shared_ptr thread-selamat untuk objek yang diurusnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn