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

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

Patricia Arquette
リリース: 2024-11-15 13:03:02
オリジナル
332 人が閲覧しました

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、c は引き続き元の A(1) を指します。

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

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

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