重新考虑共享指针和线程安全
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指向的实际对象的线程安全访问,你需要一个单独的同步机制。一种常见的方法是使用互斥体或锁来保护修改共享对象的任何操作。这样,一次只有一个线程可以修改它,从而防止数据损坏。
结论
记住,std::shared_ptr 主要用于协调多个线程之间的引用计数副本。它不会神奇地使底层对象成为线程安全的。因此,在访问和修改共享对象时,请始终采用适当的线程同步技术以避免潜在的问题。
以上是std::shared_ptr 对于对象访问来说真的是线程安全的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!