【问题标题】:Is counter in std::shared_ptr atomic?std::shared_ptr 中的计数器是原子的吗?
【发布时间】:2020-10-28 06:06:24
【问题描述】:

在采访中,有人问我std::shared_ptr 中的计数器有什么特殊性(它是原子的)。但是,我听说std::shared_ptr 不适用于多线程。什么是真的?

【问题讨论】:

  • 是的,它有一个原子计数器。不过,说它“不适用于多线程”确实含糊不清。这一切都取决于你用它做什么以及你的好坏指标是什么。
  • 还有其他方法可以实现不需要计数器的 shared_ptr(在 shared_ptr 之间使用指针环)。
  • This answerstd::shared_ptr 中有更多关于原子计数器的详细信息

标签: c++ c++11 shared-ptr atomic


【解决方案1】:

所有成员函数(包括复制构造函数和复制赋值)都可以由多个线程在 shared_ptr 的不同实例上调用而无需额外同步,即使这些实例是副本并共享同一对象的所有权。如果多个执行线程在没有同步的情况下访问同一个 shared_ptr 并且这些访问中的任何一个使用 shared_ptr 的非常量成员函数,则将发生数据竞争;原子函数的 shared_ptr 重载可用于防止数据竞争。

换句话说,您可以安全地构造和复制它们,但共享对象本身不受保护。

【讨论】:

猜你喜欢
  • 2022-07-26
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2013-02-14
相关资源
最近更新 更多