`std::shared_ptr` は実際にどの程度のスレッド セーフ性を提供しますか?

DDD
リリース: 2024-11-14 17:24:02
オリジナル
146 人が閲覧しました

How Much Thread-Safety Does `std::shared_ptr` Actually Provide?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート