C++11中_Sp_counted_base的_M_add_ref_lock_nothrow函数是否会陷入无限循环?
问题分析:_M_add_ref_lock_nothrow()循环是否会无限循环
代码展示
template <> inline bool _Sp_counted_base<_S_atomic>::_M_add_ref_lock_nothrow() noexcept { // Perform lock-free add-if-not-zero operation. _Atomic_word __count = _M_get_use_count(); do { if (__count == 0) return false; // Replace the current counter value with the old value + 1, as // long as it's not changed meanwhile. } while (!__atomic_compare_exchange_n(&_M_use_count, &__count, __count + 1, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED)); return true; }
该代码位于c++/11/bits/shared_ptr_base.h的_M_add_ref_lock_nothrow()函数中。
问题解答
不会进入无限循环。
核心原因是__atomic_compare_exchange_n的特性:当比较交换操作失败(即当前_M_use_count的值和__count存储的期望值不匹配)时,函数会自动将__count更新为_M_use_count的当前实际值。
每次循环迭代失败后,__count都会同步成最新的计数器值,后续循环会基于这个新值执行逻辑:
- 如果新的
__count为0,直接返回false终止循环; - 如果新的
__count不为0,会再次尝试将计数器加1的比较交换操作。
哪怕有其他线程频繁修改_M_use_count,循环要么最终成功完成计数器加1并返回true,要么在某次迭代中检测到计数器为0而退出,绝不会出现无限循环的情况。
内容的提问来源于stack exchange,提问作者besnnad
相关产品推荐
相关产品推荐

