std::shared_ptr 线程安全
文档指出多个线程可以安全地读取和写入不同的 std::shared_ptr 对象,即使在它们代表具有共享所有权的副本。然而,这并不意味着修改shared_ptr对象本质上是安全的。
需要澄清的是,std::shared_ptr的线程安全保证仅扩展到控制块的管理,该控制块跟踪共享所有权多个shared_ptr实例。 Shared_ptr 的内容,包括它指向的对象,本质上不是线程安全的。
例如,您提到的代码可能不会按预期运行:
shared_ptr<myClass> global = make_shared<myClass>(); ... // In thread 1 shared_ptr<myClass> private = global; ... // In thread 2 global = make_shared<myClass>(); ...
在此在这种情况下,不保证线程 1 的 private 会保持全局的原始值或更新后的值。这是因为在线程2中修改global的值不是线程安全的,会导致未定义的行为。
为了保证多个线程访问的shared_ptr实例的有效性,需要采用同步机制,例如std ::互斥体,以保护代码的关键部分。将shared_ptr对象的内容视为非线程安全并使用适当的同步技术保护对共享资源的并发访问非常重要。
以上是修改 `std::shared_ptr` 对象是线程安全的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!