我可以同时复制一个shared_ptr吗?

Shl*_*oim 3 c++ multithreading shared-ptr atomicity c++11

我知道shared_ptr在2个单独的线程中复制和重置单个是有问题的,但是2个线程试图创建同一个shared_ptr对象的副本呢.它需要同步吗?参考计数器在这里是否正常工作?

std::shared_ptr<T> global_t(new T());

// Thread 1
std::shared_ptr<T> t1(global_t);
do something with t1

// Thread 2
std::shared_ptr<T> t2(global_t);
do something with t2
Run Code Online (Sandbox Code Playgroud)

Ded*_*tor 9

一个std::shared_ptr引用计数是同步的,因此并发复制是可以的(尽管可能性能较差).并且只有在其refcount降至零时才会释放托管对象.

  • @AndyT是的.可以说,这仍然是正确的决定.也许.不知道第二个变种会有多昂贵...... (2认同)
  • 不.在没有同步的情况下从不同的线程复制和重置相同的`shared_ptr`对象是数据竞争,因此是UB.对控制块的访问是同步的,而不是`shared_ptr`对象本身.这就是为什么当你真正需要以原子方式对同一个`shared_ptr`对象进行操作时,所有那些`atomic_*`函数. (2认同)