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

问题描述 投票:0回答:2

如果使用std :: make_shared创建一个指向对象的共享指针,并使用弱指针作为观察者。当共享指针的引用计数达到零时,该对象不会被释放,因为弱指针使其保持活动状态。 (如果我没有在这里弄错。)假设在弱指针上调用成员函数lock()之后,结果证明它已经过期了。现在程序员想调用reset()来触发对象的破坏,因为对象非常大。

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

smart-pointers
2个回答
0
投票

只有在引用该对象的每个weak_ptr重置后,该对象才会被释放。

你不会修改多个线程中的单个weak_ptr,因此单个resetweak_ptr不需要是原子的。


0
投票

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以获取解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.