std::shared_ptr のスレッド セーフ
std::shared_ptr のスレッド セーフに関して MSDN から引用した記述は、誤解される可能性があります。これは、複数のスレッドが個別のshared_ptrオブジェクトを同時に読み書きできる一方で、shared_ptrオブジェクト自体の変更の安全性が保証されないことを意味します。
TL;DR:
std::shared_ptr のスレッド セーフは、同じ基になるオブジェクトを指す複数のポインターの管理にのみ関係します。共有オブジェクトのコンテンツや、shared_ptr インスタンスへの同時書き込みには拡張されません。
内訳:
shared_ptr は、内部的に 2 つのコンポーネントで構成されます:
例:
コード スニペットでは、global は構成オブジェクトへの共有ポインタです。スレッド 1 は、グローバルを独自の共有ポインター (プライベート) にコピーします。スレッド 2 が後でグローバルを変更した場合、制御ブロックは変更されないため、プライベートは依然として元の構成オブジェクトを指します。ただし、スレッド 2 が新しい構成オブジェクトをグローバルに割り当てた場合、プライベートは元のオブジェクトをポイントしたままになります。
ポイントされたオブジェクトのスレッド セーフティ:
安全に実行する機能複数のスレッドを介して指定されたオブジェクトを変更するかどうかは、オブジェクトの実装によって異なります。構成クラスの場合、設定の追加や削除など、同期なしの同時書き込みが許可されている場合、コードはスレッドセーフではありません。
解決策:
オブジェクト変更に対するスレッドの安全性を確保するには、std::mutex などの同期メカニズムを使用して、shared_ptr オブジェクトまたは共有オブジェクトへのアクセスを保護しますそれ自体。
以上がstd::shared_ptr は本当にスレッドセーフなのでしょうか?また、ポイントされたオブジェクトへの同時変更はどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。