首页 >后端开发 >C++ >std::shared_ptr 真的是线程安全的吗?对指向的对象的并发修改又如何呢?

std::shared_ptr 真的是线程安全的吗?对指向的对象的并发修改又如何呢?

Patricia Arquette
Patricia Arquette原创
2024-11-17 03:44:03550浏览

Is std::shared_ptr truly thread-safe, and what about concurrent modifications to the pointed object?

std::shared_ptr 的线程安全

您从 MSDN 引用的有关 std::shared_ptr 线程安全的声明可能会被误解。这意味着虽然多个线程可以同时读写不同的shared_ptr对象,但这并不能保证修改shared_ptr对象本身的安全性。

TL;DR:

std::shared_ptr 的线程安全仅适用于指向同一底层对象的多个指针的管理。它不会扩展到共享对象的内容或对shared_ptr实例的并发写入。

详细说明:

shared_ptr内部由两个组件组成:

  • 控制块:管理shared_ptr的引用计数并确保正确销毁所指向的对象。该组件是线程安全的。
  • Pointed Object:被共享的实际数据结构或对象。该对象的线程安全性取决于其实现。

示例:

在您的代码片段中,global 是指向配置对象的共享指针。线程 1 将 global 复制到它自己的共享指针 private 中。如果线程 2 随后修改 global,private 仍将指向原始配置对象,因为控制块未修改。但是,如果线程 2 将新的配置对象分配给全局,则 private 仍将指向原始对象。

指向对象的线程安全性:

安全地进行操作的能力通过多个线程修改指向的对象取决于对象的实现。对于您的配置类,如果它允许并发写入而不同步,例如添加或删除设置,则代码将不是线程安全的。

解决方案:

为了保证对象修改的线程安全,请使用std::mutex等同步机制来保护对shared_ptr对象或共享对象本身的访问。

以上是std::shared_ptr 真的是线程安全的吗?对指向的对象的并发修改又如何呢?的详细内容。更多信息请关注PHP中文网其他相关文章!

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