「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > std::shared_ptr は本当にスレッドセーフなのでしょうか?また、ポイントされたオブジェクトへの同時変更はどうなりますか?

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

2025 年 1 月 7 日に公開
ブラウズ:989

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 オブジェクトまたは共有オブジェクトへのアクセスを保護します。それ自体。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3