You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:08:19