To What Degree Does std::shared_ptr Ensure Thread-Safety?
Understanding the thread safety of std::shared_ptr is crucial for concurrent programming. Here's a detailed examination of your questions:
1. Standard guarantees that reference counting is handled thread safe and it's platform independent, right?
Yes, this is correct. The reference count is managed atomically, ensuring thread-safe operation regardless of the underlying platform.
2. Similar issue - standard guarantees that only one thread (holding last reference) will call delete on shared object, right?
Yes, this is also true. The standard ensures that when the last reference to a shared object is released, only one thread will call the destructor, ensuring object destruction without race conditions.
3. Shared_ptr doesn't guarantee any thread safety for the object stored in it?
Correct. std::shared_ptr provides thread safety for managing pointers and reference counts, but it does not guarantee the thread safety of the underlying object itself. The object's thread safety depends on its implementation.
Example:
Consider the following 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));
Contrary to your assumption, after calling reset() in thread IV, d will point to the newly created A(10), while a, b, and c will continue to point to the original A(1). This behavior is illustrated in the following code:
#include <memory> #include <iostream> struct A { int a; A(int a) : a(a) {} }; int main() { shared_ptr<A> a(new A(1)); shared_ptr<A> b(a), c(a), d(a); cout << "a: " << a->a << "\tb: " << b->a << "\tc: " << c->a << "\td: " << d->a << endl; d.reset(new A(10)); cout << "a: " << a->a << "\tb: " << b->a << "\tc: " << c->a << "\td: " << d->a << endl; return 0; }
Output:
a: 1 b: 1 c: 1 d: 1 a: 1 b: 1 c: 1 d: 10
以上が`std::shared_ptr` は実際にどの程度のスレッド セーフ性を提供しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。