ホームページ  >  記事  >  バックエンド開発  >  std::shared_ptr は本当にスレッドセーフなのでしょうか?また、ポイントされたオブジェクトへの同時変更はどうなりますか?

std::shared_ptr は本当にスレッドセーフなのでしょうか?また、ポイントされたオブジェクトへの同時変更はどうなりますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-17 03:44:03478ブラウズ

Is std::shared_ptr truly thread-safe, and what about concurrent modifications to the pointed object?

std::shared_ptr のスレッド セーフ

std::shared_ptr のスレッド セーフに関して MSDN から引用した記述は、誤解される可能性があります。これは、複数のスレッドが個別のshared_ptrオブジェクトを同時に読み書きできる一方で、shared_ptrオブジェクト自体の変更の安全性が保証されないことを意味します。

TL;DR:

std::shared_ptr のスレッド セーフは、同じ基になるオブジェクトを指す複数のポインターの管理にのみ関係します。共有オブジェクトのコンテンツや、shared_ptr インスタンスへの同時書き込みには拡張されません。

内訳:

shared_ptr は、内部的に 2 つのコンポーネントで構成されます:

  • 制御ブロック:shared_ptr の参照カウントを管理し、ファイルの適切な破棄を保証します。尖った物体。このコンポーネントはスレッドセーフです。
  • ポイントされたオブジェクト: 共有される実際のデータ構造またはオブジェクト。このオブジェクトのスレッド セーフは、その実装によって異なります。

例:

コード スニペットでは、global は構成オブジェクトへの共有ポインタです。スレッド 1 は、グローバルを独自の共有ポインター (プライベート) にコピーします。スレッド 2 が後でグローバルを変更した場合、制御ブロックは変更されないため、プライベートは依然として元の構成オブジェクトを指します。ただし、スレッド 2 が新しい構成オブジェクトをグローバルに割り当てた場合、プライベートは元のオブジェクトをポイントしたままになります。

ポイントされたオブジェクトのスレッド セーフティ:

安全に実行する機能複数のスレッドを介して指定されたオブジェクトを変更するかどうかは、オブジェクトの実装によって異なります。構成クラスの場合、設定の追加や削除など、同期なしの同時書き込みが許可されている場合、コードはスレッドセーフではありません。

解決策:

オブジェクト変更に対するスレッドの安全性を確保するには、std::mutex などの同期メカニズムを使用して、shared_ptr オブジェクトまたは共有オブジェクトへのアクセスを保護しますそれ自体。

以上がstd::shared_ptr は本当にスレッドセーフなのでしょうか?また、ポイントされたオブジェクトへの同時変更はどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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