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

在C++多线程编程中,std::atomic 提供了一种无需显式加锁即可实现线程安全操作的方式。它用于保证对共享变量的读、写或修改是原子的,避免数据竞争(data race),从而确保程序的正确性。
原子操作是指不会被线程调度机制打断的操作——要么完全执行,要么不执行,中间状态对外不可见。在多线程环境下,多个线程同时访问同一变量时,普通读写可能产生未定义行为,而使用 std::atomic 可以确保这些操作是安全的。
例如,两个线程同时对一个整型变量做自增操作:
int counter = 0; // 多个线程执行 counter++; // 非原子操作,结果不确定
这种情况下,由于 counter++ 包含读取、加1、写回三个步骤,可能出现竞态条件。使用 std::atomic<int> 就能解决这个问题。
立即学习“C++免费学习笔记(深入)”;
要使用原子类型,需包含头文件 <atomic>,然后声明原子变量:
#include <atomic>
std::atomic<int> counter{0}; // 初始化为0
常见成员函数包括:
示例:线程安全的计数器
#include <iostream>
#include <thread>
#include <vector>
#include <atomic>
std::atomic<int> cnt(0);
void increment() {
for (int i = 0; i < 1000; ++i) {
cnt++; // 原子自增
}
}
int main() {
std::vector<std::thread> 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,不会出现数据竞争。
默认情况下,std::atomic 使用最严格的内存序 std::memory_order_seq_cst(顺序一致性),保证所有线程看到的操作顺序一致,但性能开销较大。
可以根据需求选择更宽松的内存序来提升性能:
示例:使用 relaxed 内存序的高性能计数器
std::atomic<int> fast_count{0};
void fast_increment() {
for (int i = 0; i < 1000; ++i) {
fast_count.fetch_add(1, std::memory_order_relaxed);
}
}
如果只是统计总数且不依赖其他内存操作顺序,relaxed 是安全且高效的。
compare_exchange_weak 和 compare_exchange_strong 是构建无锁数据结构的核心工具。它们实现“如果当前值等于预期值,则替换为新值”的原子操作。
典型用法模式:
std::atomic<int> 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的线程安全操作解析的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号