是否使用shared_ptr的内部指针进行操作?

Mih*_*yan 5 c++ multithreading thread-safety shared-ptr

同时复制和重置shared_ptr是否安全?

即考虑以下代码

// Main thread (before creating any other threads)
shared_ptr<A> a(new A(1));

// Thread 1
shared_ptr<A> a_copy = a;

// Thread 2
a.reset(new(A(2));
Run Code Online (Sandbox Code Playgroud)

线程1和2并行运行.我可以确定,它a_copy会将指针存储到较旧的A(1)或较新的A(2)共享对象吗?

Pot*_*ter 7

cppreference:

所有成员函数(包括拷贝构造和拷贝赋值)可以通过在多线程调用不同实例shared_ptr 没有即使这些实例是副本并共享相同的对象的所有权额外的同步.

所以,答案是否定的 - 这些操作不是线程安全的,因为复制和重置都应用于同一个实例,a.结果是数据竞争,导致未定义的行为.