C++11通过std::atomic提供原子操作支持,实现无锁并发,提升性能。std::atomic可用于整型、指针等类型,常用操作包括store、load、exchange、compare_exchange_weak、fetch_add/sub。内存序如memory_order_relaxed、acquire、release、seq_cst控制同步行为,合理选择可优化性能。需注意类型限制和is_lock_free检查,避免误用导致逻辑错误或性能下降。

C++11引入了对原子操作的原生支持,通过
std::atomic
std::atomic
int
bool
long
声明一个原子整数并进行操作:
#include <atomic>
#include <iostream>
std::atomic<int> counter(0);
void increment() {
for (int i = 0; i < 1000; ++i) {
counter.fetch_add(1, std::memory_order_relaxed);
}
}
上面代码中,多个线程调用
increment
fetch_add
立即学习“C++免费学习笔记(深入)”;
std::atomic
std::atomic<int> val(0);
int expected = val.load();
while (!val.compare_exchange_weak(expected, 42)) {
// 如果val仍等于expected,则设为42;否则更新expected为当前值重试
}
// 最终val为42
原子操作可以指定内存顺序,控制操作周围的内存访问如何排序。常用的
std::memory_order
例如,在标志位同步中使用acquire/release可避免不必要的全局同步开销:
std::atomic<bool> ready(false);
int data = 0;
// 线程1:写数据
data = 42;
ready.store(true, std::memory_order_release);
// 线程2:读数据
while (!ready.load(std::memory_order_acquire)) {
// 等待
}
// 此时data一定可见为42
不是所有类型都能用于
std::atomic<T>
可以通过
is_lock_free()
std::atomic<int> a; std::cout << "lock free: " << a.is_lock_free() << std::endl;
若返回false,说明该原子操作内部可能使用了锁,性能优势降低。
基本上就这些。合理使用
std::atomic
以上就是C++11原子操作与std::atomic使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号