I’m reading http://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.html and some thread safety issues are still not clear for me:
- Standard guarantees that reference counting is handled thread safe and it’s platform independent, right?
- Similar issue – standard guarantees that only one thread (holding last reference) will call delete on shared object, right?
- shared_ptr does not guarantee any thread safety for object stored in it?
EDIT:
Pseudo code:
// 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));
Calling reset() in thread IV will delete previous instance of A class created in first thread and replace it with new instance? Moreover after calling reset() in IV thread other threads will see only newly created object?
As others have pointed out, you’ve got it figured out correctly regarding your original 3 questions.
But the ending part of your edit
is incorrect. Only
dwill point to the newA(10), anda,b, andcwill continue to point to the originalA(1). This can be seen clearly in the following short example.(Clearly, I didn’t bother with any threading: that doesn’t factor into the
shared_ptr::reset()behavior.)The output of this code is