原子操作是不可分割的操作,std::atomic 提供线程安全的共享变量访问,避免数据竞争,支持原子读写、自增及比较交换等操作,并通过内存序控制性能与可见性。

在C++多线程编程中,std::atomic 提供了一种无需显式加锁即可实现线程安全操作的方式。它用于保证对共享变量的读、写或修改是原子的,避免数据竞争(data race),从而确保程序的正确性。
什么是原子操作?
原子操作是指不会被线程调度机制打断的操作——要么完全执行,要么不执行,中间状态对外不可见。在多线程环境下,多个线程同时访问同一变量时,普通读写可能产生未定义行为,而使用 std::atomic 可以确保这些操作是安全的。
例如,两个线程同时对一个整型变量做自增操作:
int counter = 0;// 多个线程执行 counter++; // 非原子操作,结果不确定
这种情况下,由于 counter++ 包含读取、加1、写回三个步骤,可能出现竞态条件。使用 std::atomic 就能解决这个问题。
立即学习“C++免费学习笔记(深入)”;
基本用法:声明和常用操作
要使用原子类型,需包含头文件 ,然后声明原子变量:
#include std::atomic counter{0}; // 初始化为0
常见成员函数包括:
load():原子地读取当前值 store(val):原子地写入新值 exchange(val):设置新值,并返回旧值 compare_exchange_weak() 和 compare_exchange_strong():比较并交换(CAS),用于实现无锁算法 支持部分内置类型的原子运算符,如 ++、–、+= 等(仅限整型和指针类型)
示例:线程安全的计数器
#include #include #include #include std::atomic cnt(0);void increment() { for (int i = 0; i < 1000; ++i) { cnt++; // 原子自增 }}int main() { std::vector threads; for (int i = 0; i < 10; ++i) { threads.emplace_back(increment); } for (auto& t : threads) { t.join(); } std::cout << "Final count: " << cnt.load() << 'n'; // 输出 10000 return 0;}
这里每个线程对 cnt 执行1000次自增,最终结果准确为10000,不会出现数据竞争。
内存序(Memory Order)控制性能与可见性
默认情况下,std::atomic 使用最严格的内存序 std::memory_order_seq_cst(顺序一致性),保证所有线程看到的操作顺序一致,但性能开销较大。
可以根据需求选择更宽松的内存序来提升性能:
std::memory_order_relaxed:只保证原子性,不保证顺序。适合计数器等场景 std::memory_order_acquire:用于读操作,确保之后的读写不会被重排到该操作之前 std::memory_order_release:用于写操作,确保之前的读写不会被重排到该操作之后 std::memory_order_acq_rel:同时具备 acquire 和 release 语义 std::memory_order_seq_cst:最强一致性,默认选项
示例:使用 relaxed 内存序的高性能计数器
std::atomic fast_count{0};void fast_increment() { for (int i = 0; i < 1000; ++i) { fast_count.fetch_add(1, std::memory_order_relaxed); }}
如果只是统计总数且不依赖其他内存操作顺序,relaxed 是安全且高效的。
compare-and-swap 实现无锁逻辑
compare_exchange_weak 和 compare_exchange_strong 是构建无锁数据结构的核心工具。它们实现“如果当前值等于预期值,则替换为新值”的原子操作。
典型用法模式:
std::atomic val{10};int expected = val.load();while (!val.compare_exchange_weak(expected, expected + 1)) { // 如果 val 已被其他线程修改,expected 会被更新为当前值 // 循环继续尝试,直到成功}
注意:compare_exchange_weak 允许偶然失败(即使值匹配也可能失败),通常放在循环中使用;compare_exchange_strong 更可靠,但在某些平台上稍慢。
此机制可用于实现线程安全的单例、无锁队列、状态机等高级结构。
基本上就这些。std::atomic 是C++中实现高效线程同步的重要工具,合理使用可以避免锁带来的阻塞和死锁问题,但也要求开发者理解内存模型和并发逻辑。掌握 load/store/CAS 和内存序的选择,是写出正确又高效的并发代码的关键。不复杂但容易忽略细节。
以上就是c++++中std::atomic原子操作的用法_c++原子类型atomic的线程安全操作解析的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1480686.html
微信扫一扫
支付宝扫一扫