atomic笔记

atomic笔记

C++ 中实现原子操作、解决多线程数据竞争的核心工具

初始化

cpp 复制代码
// 直接初始化(推荐)
std::atomic<int> a2(10);

// 赋值初始化(C++17 后支持)
std::atomic<int> a3 = 20;

读 store

cpp 复制代码
// 写操作:两种方式等价
num.store(10); // 显式写(推荐,可指定内存序,后面讲)
num = 20;      // 隐式写(等价于 num.store(20))

写 load

cpp 复制代码
// 读操作:两种方式等价
int val1 = num.load(); // 显式读
int val2 = num;        // 隐式读

改 exchange

cpp 复制代码
std::atomic<int> num(10);
// 准备要替换的新值
int new_val = 20;
// 执行原子交换:返回旧值,同时将num设为新值
int old_val = num.exchange(new_val);

判断是否改变

cpp 复制代码
std::atomic<int> value(true); // 等价于 value = 1
int new_val = false;          // 等价于 new_val = 0
if (value.exchange(new_val) != new_val) {
    std::cout << "变量已改变" << std::endl; // 会执行这行
} else {
    std::cout << "变量未改变" << std::endl;
}

自增 fetch_add ++ 与 自减 fetch_sub --

原子操作 等价写法 核心一致点
auto temp = num++; auto temp = num.fetch_add(1); temp 都是自增前的旧值
auto temp = ++num; auto temp = num.fetch_add(1) + 1; temp 都是自增后的新值
auto temp = num--; auto temp = num.fetch_sub(1); temp 都是自减前的旧值
auto temp = --num; auto temp = num.fetch_sub(1) - 1; temp 都是自减后的新值
相关推荐
水云桐程序员12 分钟前
从零开发软件的步骤,软件开发从零到完成应该怎么做?
笔记·学习·软件构建·个人开发
David猪大卫21 分钟前
【Linux修炼】环境变量、进程地址空间
linux·c语言·经验分享·笔记·学习·ubuntu·centos
叼烟扛炮2 小时前
Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”
linux·服务器·数据库·笔记·学习·php
老师我太想进步了20266 小时前
【数据结构-4】算法美学之顺序表
数据结构·算法
风影同志783246 小时前
编码器是激活函数吗?—— 一个看起来很像、其实不是的类比
算法
UIU1146 小时前
P1481 魔族密码
c++·算法·动态规划
叼烟扛炮8 小时前
Linux 学习笔记(五十八):IO 多路复用封神——epoll 底层原理揭秘
linux·运维·服务器·网络·笔记·学习·php
陈布衣9 小时前
MySQL(1)_MySQL 5.7.21 Linux 安装笔记
linux·笔记·mysql
加宝的起点雷达10 小时前
40 条候选里 38 条来自同一个源,主卡整屏重样
人工智能·算法·创业