如果使用std :: make_shared创建一个指向对象的共享指针,并使用弱指针作为观察者。当共享指针的引用计数达到零时,该对象不会被释放,因为弱指针使其保持活动状态。 (如果我没有在这里弄错。)假设在弱指针上调用成员函数lock()之后,结果证明它已经过期了。现在程序员想调用reset()来触发对象的破坏,因为对象非常大。
问题是:重置原子操作?如果答案是否定的,我的下一个问题是为什么标准不要求它是原子的。
只有在引用该对象的每个weak_ptr
重置后,该对象才会被释放。
你不会修改多个线程中的单个weak_ptr
,因此单个reset
的weak_ptr
不需要是原子的。
C ++ 20引入了一个帮助类std :: atomic,它保证引用
std :: atomic for std :: weak_ptr的部分模板特化允许用户以原子方式操作weak_ptr对象。
如果多个执行线程在没有同步的情况下访问相同的std :: weak_ptr对象,并且任何访问都使用weak_ptr的非const成员函数,那么除非通过std :: atomic>的实例执行所有此类访问,否则将发生数据争用。
如果没有使用C ++ 20,请检查此SO answer by Chris Jester-Young以获取解决方法。