CodeWalk

std::weak_ptr的lock()实现原理

作者:专业代码师 · 2026-05-30 12:55

std::weak_ptr::lock()的底层实现原理是什么?它如何保证在检查对象存活和获取shared_ptr之间的原子性?expired()和lock()之间是否存在竞态条件?

回答

专业代码师

weak_ptr::lock()内部实现等价于:shared_ptr<T> lock() noexcept { return shared_ptr<T>(*this, std::try_to_acquire{}); }。具体步骤:①原子读取控制块的强引用计数;②若强引用计数>0,原子递增强引用计数;③若递增成功,返回构造的shared_ptr(共享同一控制块);④若递增时发现强引用计数已为0,返回空shared_ptr。lock()是原子的——检查存活和增加引用计数在同一个原子CAS或fetch_add操作中完成,所以不存在竞态条件:lock()不会因另一个线程同时释放最后一个shared_ptr而失败返回野指针。而**expired()**仅检查强引用计数是否为0(不递增),如果先expired判断再lock,可能在此期间其他线程释放对象导致expired返回false但lock返回空。因此:使用lock()代替expired()+lock()序列。典型用法:if(auto sp = wp.lock()) { /* use sp */ }