使用 shared_ptr 的内部指针的操作是原子的吗?

Are operations with the internal pointer of shared_ptr atomic?

同时复制和重置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));

其中线程 1 和 2 运行 并行。我可以确定 a_copy 将存储指向较旧的 A(1) 或较新的 A(2) 共享对象的指针吗?

来自cppreference

All member functions (including copy constructor and copy assignment) can be called by multiple threads on different instances of shared_ptr without additional synchronization even if these instances are copies and share ownership of the same object.

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

不,他们不是,请参阅@Potatoswatter 的回答。

但是如果你需要原子操作一个shared_ptr,你可以使用these dedicated functions。 (尽管据我所知,它们仅在 GCC/Clang 的最新版本上实现)。

所以你的例子是:

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

// Thread 1
shared_ptr<A> a_copy = atomic_load(&a);

// Thread 2
atomic_store(&a, make_shared<A>(2) );