ฉันกำลังอ่านhttp://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.htmlและปัญหาด้านความปลอดภัยของเธรดยังไม่ชัดเจนสำหรับฉัน:
- มาตรฐานรับประกันว่าการนับอ้างอิงได้รับการจัดการเธรดอย่างปลอดภัยและเป็นอิสระจากแพลตฟอร์มใช่ไหม
- ปัญหาที่คล้ายกัน - มาตรฐานรับประกันว่าเธรดเดียวเท่านั้น (ถือการอ้างอิงสุดท้าย) จะเรียกลบในวัตถุที่แชร์ใช่ไหม
- shared_ptr ไม่รับประกันความปลอดภัยของเธรดใด ๆ สำหรับอ็อบเจ็กต์ที่เก็บอยู่ในนั้น?
แก้ไข:
รหัสหลอก:
// 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));
การเรียกการรีเซ็ต () ในเธรด IV จะลบอินสแตนซ์ก่อนหน้าของคลาส A ที่สร้างในเธรดแรกและแทนที่ด้วยอินสแตนซ์ใหม่? ยิ่งไปกว่านั้นหลังจากเรียกการรีเซ็ต () ในเธรด IV เธรดอื่น ๆ จะเห็นเฉพาะวัตถุที่สร้างขึ้นใหม่?
make_shared
แทนnew