首页  >  文章  >  后端开发  >  std::shared_ptr 对于它管理的对象来说是线程安全的吗?

std::shared_ptr 对于它管理的对象来说是线程安全的吗?

Patricia Arquette
Patricia Arquette原创
2024-11-15 13:03:02257浏览

Is std::shared_ptr thread-safe for the object it manages?

std::shared_ptr 在多大程度上保证线程安全?

原始问题:

  1. 参考std::shared_ptr 中的计数保证是线程安全和平台无关的。
  2. 只有持有最后一个引用的线程才会调用共享对象上的删除。
  3. std::shared_ptr 确实如此不为其存储的对象提供任何线程安全性。

答案:

是的,前两个问题是准确的。 std::shared_ptr 的引用计数和析构函数调用是线程安全的。

第三个问题也是正确的。 std::shared_ptr 不保证其中存储的对象的线程安全。对象本身可能不是线程安全的,因此,在没有适当同步的情况下从多个线程访问它可能会导致未定义的行为。

示例:

考虑以下内容一段伪代码:

// Thread I
shared_ptr<A> a (new A (1));

// Thread II
shared_ptr<A> b (a);

// Thread III
shared_ptr<A> c (a);

// Thread IV
shared_ptr<A> d (a);

d.reset (new A (10));
  • 问题:在线程IV中调用reset()会删除线程I中创建的A的先前实例并用新实例替换它吗?
  • 答案:不会,只有 d 会指向新的 A(10),而 a、b、c 会继续指向原来的 A(1)。

这是因为reset()不会影响其他线程对同一对象的引用。 d 是唯一指向新实例的共享指针,而其他引用(a、b 和 c)将仍然指向原始实例。

以上是std::shared_ptr 对于它管理的对象来说是线程安全的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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