std::shared_ptr 的线程安全
您从 MSDN 引用的有关 std::shared_ptr 线程安全的声明可能会被误解。这意味着虽然多个线程可以同时读写不同的shared_ptr对象,但这并不能保证修改shared_ptr对象本身的安全性。
TL;DR:
std::shared_ptr 的线程安全仅适用于指向同一底层对象的多个指针的管理。它不会扩展到共享对象的内容或对shared_ptr实例的并发写入。
详细说明:
shared_ptr内部由两个组件组成:
示例:
在您的代码片段中,global 是指向配置对象的共享指针。线程 1 将 global 复制到它自己的共享指针 private 中。如果线程 2 随后修改 global,private 仍将指向原始配置对象,因为控制块未修改。然而,如果线程2将新的配置对象分配给全局,则私有将仍然指向原始对象。
指向对象的线程安全性:
安全地进行操作的能力通过多个线程修改指向的对象取决于对象的实现。对于您的配置类,如果它允许并发写入而无需同步,例如添加或删除设置,则代码将不是线程安全的。
解决方案:
为了确保对象修改的线程安全,请使用std::mutex等同步机制来保护对shared_ptr对象或共享对象本身的访问。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3