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