同时复制和重置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)
共享对象?
答案 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