0

0

C++怎么使用原子智能指针_C++atomic_shared_ptr实验特性【并发】

冰火之心

冰火之心

发布时间:2026-02-28 14:39:10

|

697人浏览过

|

来源于php中文网

原创

std::atomic_shared_ptr 不是标准c++特性,已被否决,当前编译器均不支持;应使用 std::atomic 并链接 -latomic(gcc/clang),或改用互斥锁等更稳妥方案。

c++怎么使用原子智能指针_c++atomic_shared_ptr实验特性【并发】

std::atomic_shared_ptr 是什么,现在能用吗

它不是标准 C++ 的正式特性,而是 C++20 中作为 std::atomic<:shared_ptr>></:shared_ptr> 的替代提案,在 TS(Technical Specification)中出现过,但最终被否决了。目前主流编译器(GCC、Clang、MSVC)**都不支持 std::atomic_shared_ptr 这个类型名**——你写上去会直接报错:error: 'atomic_shared_ptr' is not a member of 'std'

真正可用的是 std::atomic<:shared_ptr>></:shared_ptr>,它从 C++20 起成为标准,但前提是你的 T* 必须是 trivially copyable(比如裸指针本身是,但 std::shared_ptr 内部结构是否可原子操作,取决于实现是否提供特化)。

常见错误现象:

  • 写了 std::atomic_shared_ptr<int></int>,编译失败
  • 写了 std::atomic<:shared_ptr>></:shared_ptr>,却在链接时报 undefined reference to __atomic_load_16(尤其在 x86-64 上)

为什么 std::atomic<:shared_ptr>> 链接失败

因为 std::shared_ptr 通常 16 字节(控制块指针 + 管理对象指针),而 x86-64 默认不支持原生 16 字节原子操作,需要编译器生成库级原子调用(如 __atomic_load_16),这依赖 libatomic。

立即学习C++免费学习笔记(深入)”;

实操建议:

摩笔天书
摩笔天书

摩笔天书AI绘本创作平台

下载
  • 用 GCC/Clang 编译时,必须加 -latomic 链接选项(CMake 中: target_link_libraries(your_target atomic)
  • MSVC 没这个问题,它用内建函数或锁回退,但性能略低
  • 如果只在单核或确定无竞争场景用,其实没必要强上原子操作——std::shared_ptr 本身的引用计数已经是原子的,只是指针赋值不是

怎么安全地原子更新 shared_ptr 的指向

核心目标其实是:在多线程中无锁地替换一个 std::shared_ptr<t></t> 变量的值(比如配置热更新、状态切换)。正确做法是用 std::atomic<:shared_ptr>></:shared_ptr> + load()/store() 或 CAS。

示例(注意对齐和初始化):

std::atomic<std::shared_ptr<int>> ptr;
ptr.store(std::make_shared<int>(42)); // OK
auto p = ptr.load();                   // OK
ptr.exchange(std::make_shared<int>(100)); // OK

容易踩的坑:

  • 不能直接 ptr = std::make_shared<int>(42)</int> —— 会调用隐式转换构造,但该构造非原子,必须显式用 store()
  • 不要对 ptr.load()->value 做长时操作,因为指针可能中途被其他线程替换成新对象,旧对象已析构
  • 若 T 不是 trivially copyable(比如含虚函数、非 POD 类型),仍可工作,但原子操作本身只保证指针位模式的读写安全,不涉及 T 的构造/析构逻辑

有没有更轻量、更稳的替代方案

有。如果你只需要“原子地切换一个指针”,且不需要 shared_ptr 的共享语义,直接用 std::atomic<t></t> + 手动管理生命周期(比如配合 std::unique_ptr 或池化)更高效、更少陷阱。

或者用 std::shared_ptr 配合互斥锁(std::mutex),代码更直白、调试更友好,多数场景下性能差距远不如你想象的大。

真正复杂的地方在于:你以为你在解决并发指针更新问题,其实往往卡在内存序(memory order)选择、ABA 问题、或生命周期延长误判上——这些比选哪个原子类型难得多。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

391

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

349

2023.10.25

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

722

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

371

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

25

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

100

2026.02.06

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

5954

2023.07.31

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

0

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.4万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 19.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号