共有ポインタとスレッド セーフティの再検討
std::shared_ptr のスレッド セーフティは、C プログラマの間でよく議論されてきました。その本質を明らかにするために、詳細を掘り下げてみましょう。
注意: MS の意味
あなたが言及した MSDN の記述は誤解を招く可能性があります。はい、複数のスレッドが異なるshared_ptrオブジェクトを問題なく読み書きできます。ただし、これは共有されるオブジェクトの参照カウントを管理する制御ブロックにのみ適用されます。共有オブジェクトの内容の変更が安全であるという意味ではありません。
コントロール ブロックの特権
調整するコントロール ブロック自体スレッドセーフな参照カウントは、確かにスレッドセーフです。これにより、データの破損を心配することなく、shared_ptr インスタンスの作成と破棄を同時に行うことができます。ただし、それらが指すオブジェクトは別の話です。共有オブジェクトへのアクセス: 慎重に続行してください
指定した例では:shared_ptr<myClass> global = make_shared<myClass>();
shared_ptr<myClass> private = global; global = make_shared<myClass>();
同期の必要性
shared_ptr が指す実際のオブジェクトへのスレッドセーフなアクセスを保証するには、個別の同期メカニズム。一般的なアプローチは、ミューテックスまたはロックを使用して、共有オブジェクトを変更する操作を保護することです。こうすることで、一度に 1 つのスレッドのみが変更できるため、データの破損が防止されます。結論
std::shared_ptr は主に、複数のスレッド間の参照カウントを調整するために使用されることを覚えておいてください。コピー。基礎となるオブジェクトを魔法のようにスレッドセーフにするわけではありません。したがって、共有オブジェクトにアクセスして変更する場合は、潜在的な問題を回避するために常に適切なスレッド同期手法を採用してください。以上がstd::shared_ptr はオブジェクト アクセスに対して本当にスレッド セーフですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。