首页  >  文章  >  后端开发  >  修改 `std::shared_ptr` 对象是线程安全的吗?

修改 `std::shared_ptr` 对象是线程安全的吗?

Patricia Arquette
Patricia Arquette原创
2024-11-19 17:52:03886浏览

Is Modifying a `std::shared_ptr` Object Thread-Safe?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn