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

std::shared_ptr引用计数并发增减的线程安全问题问询

关于std::shared_ptr线程安全的疑问

我了解到std::shared_ptr<T>的引用计数通常通过带std::memory_order_relaxed的std::atomic实现,因此本身具备线程安全性,但我仍不清楚它如何在引用计数并发增减的场景下保证线程安全。

竞态场景示例

  • Thread 1:

    1. 析构shared_ptr<T>
    2. 执行rc.fetch_sub(1)
    3. 得到引用计数RC == 0,判定自己是最后持有者
    4. 调用T::~T()
  • Thread 2:

    1. 并发拷贝该shared_ptr<T>
    2. 执行rc.fetch_add(1)
    3. 得到引用计数RC == 1,判定拷贝后的shared_ptr有效
    4. 解引用shared_ptr
    5. 访问已析构的T!

这种竞态场景并非不可能,以下是手动构造的极端示例代码:

std::shared_ptr<T> ptr;
int main()
{
    std::thread t([&ptr] () 
    {
        ptr = std::make_shared<int>();
    } // 引用计数在此处减少!调用~T()
    );

    auto ptr2 = ptr; // 引用计数在此处增加! 
    ptr2->some_function(); // 访问已析构对象!

    t.join();
}

我的问题

  1. C++标准对此种情况是如何规定的?
  2. std::shared_ptr<T>是否能确保引用计数并发增减时的线程安全?

内容的提问来源于stack exchange,提问作者Bin Yan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:01:16