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

时间:2015-08-10 07:12:00

标签: 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));

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

2 个答案:

答案 0 :(得分:8)

来自cppreference

  

所有成员函数(包括复制构造函数和复制赋值)   可以由shared_ptr不同实例上的多个主题调用   即使这些实例是副本,也没有其他同步   并分享同一对象的所有权。

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

答案 1 :(得分:1)

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

但如果您 需要以原子方式操作 this.PushNavigationController = this.PushNavigationController ?? parent as UINavigationController ?? parent.ParentViewController as UINavigationController; ,则可以使用these dedicated functions。 (虽然AFAIK只在最近版本的GCC / Clang上实现)。

所以你的例子是:

shared_ptr