Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Mengubah suai `std::shared_ptr` Object Thread-Selamat?

Adakah Mengubah suai `std::shared_ptr` Object Thread-Selamat?

Patricia Arquette
Patricia Arquetteasal
2024-11-19 17:52:03886semak imbas

Is Modifying a `std::shared_ptr` Object Thread-Safe?

std::shared_ptr Thread Safety

Dokumentasi menyatakan bahawa berbilang rangkaian selamat boleh membaca dan menulis objek std::shared_ptr yang berbeza, walaupun apabila mereka mewakili salinan dengan pemilikan bersama. Walau bagaimanapun, ini tidak membayangkan bahawa mengubah suai objek shared_ptr sememangnya selamat.

Untuk menjelaskannya, jaminan keselamatan benang bagi std::shared_ptr diperluaskan semata-mata kepada pengurusan blok kawalan yang menjejaki pemilikan dikongsi antara berbilang kejadian shared_ptr. Kandungan shared_ptr, termasuk objek yang ditunjukkannya, sememangnya tidak selamat untuk thread.

Sebagai contoh, kod yang anda nyatakan mungkin tidak berkelakuan seperti yang diharapkan:

shared_ptr<myClass> global = make_shared<myClass>();
...
// In thread 1
shared_ptr<myClass> private = global;
...
// In thread 2
global = make_shared<myClass>();
...

Dalam ini senario, ia tidak dijamin bahawa peribadi urutan 1 akan mengekalkan nilai asal atau nilai global yang dikemas kini. Ini kerana mengubah suai nilai global dalam utas 2 tidak selamat untuk rangkaian dan boleh membawa kepada gelagat yang tidak ditentukan.

Untuk memastikan kesahihan kejadian shared_ptr yang diakses oleh berbilang rangkaian, adalah perlu untuk menggunakan mekanisme penyegerakan, seperti std ::mutex, untuk melindungi bahagian kritikal kod. Adalah penting untuk menganggap kandungan objek shared_ptr sebagai bukan-benang-selamat dan melindungi akses serentak kepada sumber yang dikongsi menggunakan teknik penyegerakan yang sesuai.

Atas ialah kandungan terperinci Adakah Mengubah suai `std::shared_ptr` Object Thread-Selamat?. 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
Artikel sebelumnya:Apakah Saiz \"kosong\" dalam C?Artikel seterusnya:Apakah Saiz \"kosong\" dalam C?