ホームページ  >  記事  >  バックエンド開発  >  std::shared_ptr は、管理するオブジェクトに対してスレッドセーフですか?

std::shared_ptr は、管理するオブジェクトに対してスレッドセーフですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-15 13:03:02257ブラウズ

Is std::shared_ptr thread-safe for the object it manages?

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

元の質問:

  1. リファレンスstd::shared_ptr でのカウントはスレッドセーフであることが保証されており、プラットフォームに依存しません。
  2. 最後の参照を保持しているスレッドのみが、共有オブジェクトに対して削除を呼び出します。
  3. std::shared_ptr は、格納するオブジェクトに対してスレッド セーフを提供しません。

答え:

はい、最初の 2 つの質問は次のとおりです。 正確な。 std::shared_ptr の参照カウントとデストラクターの呼び出しはスレッドセーフです。

3 番目の質問も正解です。 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 でリセット() を呼び出すと、スレッド I で作成された A の前のインスタンスが削除され、新しいインスタンスに置き換えられますか?
  • 答え: いいえ、d だけが新しい A(10) を指しますが、a、b、

これは、reset() が同じオブジェクトへの他のスレッドの参照に影響を与えないためです。 d は新しいインスタンスを指す唯一の共有ポインタですが、他の参照 (a、b、c) は元のインスタンスを指し続けます。

以上がstd::shared_ptr は、管理するオブジェクトに対してスレッドセーフですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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