ホームページ >バックエンド開発 >C++ >`std::shared_ptr` は実際にどの程度のスレッド セーフ性を提供しますか?

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

DDD
DDDオリジナル
2024-11-14 17:24:02258ブラウズ

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

std::shared_ptr はスレッド セーフ性をどの程度保証しますか?

std::shared_ptr のスレッド セーフ性を理解することは、同時実行にとって非常に重要ですプログラミング。ここであなたの質問を詳しく調べます:

1.標準では、参照カウントがスレッド セーフに処理され、プラットフォームに依存しないことが保証されていますね?

はい、これは正しいです。参照カウントはアトミックに管理され、基盤となるプラットフォームに関係なくスレッドセーフな操作が保証されます。

2.同様の問題 - 標準では、(最後の参照を保持する) 1 つのスレッドだけが共有オブジェクトに対して delete を呼び出すことが保証されていますよね?

はい、これも当てはまります。この標準では、共有オブジェクトへの最後の参照が解放されるときに、1 つのスレッドのみがデストラクターを呼び出し、競合状態が発生せずにオブジェクトが確実に破棄されることが保証されます。

3. Shared_ptr は、そこに格納されているオブジェクトのスレッド セーフを保証しません?

正解です。 std::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でreset()を呼び出した後、dは新しく作成されたA(10)を指しますが、a、b、およびcは継続します。元の A(1) を指します。この動作は、次のコードで示されています:

#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;
}

出力:

a: 1    b: 1    c: 1    d: 1
a: 1    b: 1    c: 1    d: 10

以上が`std::shared_ptr` は実際にどの程度のスレッド セーフ性を提供しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。