如果使用std :: make_shared创建指向对象的共享指针,并使用弱指针作为观察者。当共享指针的引用计数达到零时,由于弱指针使该对象保持活动状态,因此不会释放该对象。 (如果我在这里没有记错的话。)假设在该弱指针上调用成员函数lock()之后,事实证明它已经过期。现在,程序员想要调用reset()来触发对象的销毁,因为对象很大。
问题是:是否重置了原子操作?如果答案是否定的,那么我的下一个问题是,为什么标准不要求它是原子性的。
答案 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的解决方法。