弱指针的重置成员函数是原子的吗?

时间:2019-02-22 12:12:13

标签: smart-pointers

如果使用std :: make_shared创建指向对象的共享指针,并使用弱指针作为观察者。当共享指针的引用计数达到零时,由于弱指针使该对象保持活动状态,因此不会释放该对象。 (如果我在这里没有记错的话。)假设在该弱指针上调用成员函数lock()之后,事实证明它已经过期。现在,程序员想要调用reset()来触发对象的销毁,因为对象很大。

问题是:是否重置了原子操作?如果答案是否定的,那么我的下一个问题是,为什么标准不要求它是原子性的。

2 个答案:

答案 0 :(得分:0)

仅在重置每个引用该对象的weak_ptr之后,才释放该对象。

您无需修改​​多个线程中的单个weak_ptr,因此单个reset中的weak_ptr不必是原子的。

答案 1 :(得分:0)

C ++ 20引入了一个辅助类std :: atomic,该类可以保证引用

  

std :: weak_ptr的std :: atomic部分模板专用化允许用户原子地操作weak_ptr对象。

     

如果多个执行线程访问同一个std :: weak_ptr对象   没有同步,并且任何这些访问都使用非常量   weak_ptr的成员函数,那么除非所有   这种访问是通过以下方式执行的:   std :: atomic>。

如果未使用C ++ 20,请检查此SO answer by Chris Jester-Young的解决方法。