0

0

c++怎么使用原子操作(std::atomic)_c++原子操作atomic使用与示例

冰火之心

冰火之心

发布时间:2025-10-19 17:57:02

|

953人浏览过

|

来源于php中文网

原创

std::atomic 提供原子操作以避免数据竞争,支持 int、bool、指针等类型,常用方法有 load、store、fetch_add 和 compare_exchange_weak,可用于无锁编程,如原子计数、标志位同步、CAS 循环更新及原子指针操作实现无锁链表,使用时需注意内存顺序与类型限制。

c++怎么使用原子操作(std::atomic)_c++原子操作atomic使用与示例

在C++多线程编程中,std::atomic 提供了一种安全的方式来操作共享变量,避免数据竞争。它保证对特定类型的操作是原子的,即不会被其他线程中断,常用于实现无锁编程或简化同步逻辑。

1. 基本用法与常用类型

std::atomic 是一个模板类,可以包装像 int、bool、指针等可平凡复制(trivially copyable)的类型。

常用特化类型包括:

  • std::atomic
  • std::atomic
  • std::atomic(适用于指针)
  • std::atomic_flag(最轻量,只支持 test_and_set / clear)

示例:定义一个原子整数并进行自增:

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

#include
#include iostream>

std::atomic counter{0};

void increment() {
for (int i = 0; i counter.fetch_add(1); // 原子加1
}
}

2. 常见操作函数说明

原子对象提供多种操作方式,以下是核心方法:

SEEK.ai
SEEK.ai

AI驱动的智能数据解决方案,询问您的任何数据并立即获得答案

下载
  • load():原子地读取当前值
  • store(val):原子地写入值
  • fetch_add(val):加 val 并返回旧值(支持 +、- 等)
  • exchange(val):设置新值,返回旧值
  • compare_exchange_weak(expected, desired):CAS 操作,常用于实现无锁结构

示例:使用 load 和 store 安全访问:

std::atomic ready{false};

// 线程1:等待就绪
while (!ready.load()) {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
std::cout
// 线程2:设置就绪
ready.store(true);

3. compare_exchange_weak 使用示例

CAS(Compare and Swap)是实现原子更新的关键机制。常见于修改前检查是否被其他线程改动。

std::atomic value{10};

void safe_increment_if_10() {
int expected = 10;
bool success = value.compare_exchange_weak(expected, 11);
if (success) {
std::cout } else {
std::cout ailed: current value is " }
}

注意:compare_exchange_weak 可能因虚假失败而返回 false,通常放在循环中使用:

int expected = value.load();
do {
// 修改期望值
} while (!value.compare_exchange_weak(expected, expected + 1));

4. 原子指针操作

std::atomic 支持指针算术,适合实现无锁链表或队列。

struct Node {
int data;
Node* next;
};

std::atomic head{nullptr};

void push_front(int val) {
Node* new_node = new Node{val, nullptr};
Node* old_head;
do {
old_head = head.load();
new_node->next = old_head;
} while (!head.compare_exchange_weak(old_head, new_node));
}

基本上就这些。std::atomic 让你在不加锁的情况下安全操作共享变量,但要小心内存顺序(默认是 memory_order_seq_cst,最安全但也稍慢)。除非有性能要求,否则不必显式指定。使用时注意不要对复杂对象使用 atomic,它只适合基本类型和指针。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

778

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

97

2023.09.25

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

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

93

2025.08.29

C++中int的含义
C++中int的含义

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

200

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

98

2025.11.27

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

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

精品课程

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

共94课时 | 7.9万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 14.6万人学习

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

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