原子操作是不可分割的操作,能避免多线程下的数据竞争;std::atomic 提供 load、store、fetch_add、compare_exchange_weak 等方法实现原子读写与CAS操作,并通过 memory_order 控制内存顺序,确保并发安全。

在C++中,std::atomic 是实现原子操作的核心工具,它能确保对共享变量的操作不会被多个线程同时干扰,从而避免数据竞争和未定义行为。这在多线程编程中非常关键,尤其适用于无锁编程(lock-free programming)场景。
原子操作是指一个操作在执行过程中不会被其他线程中断,要么完全执行,要么完全不执行。例如,对一个计数器进行自增操作(i++),在非原子情况下,可能被拆分为“读取、加1、写回”三个步骤,多个线程同时操作时就可能出现丢失更新的问题。而使用原子操作后,整个过程是不可分割的。
要使用原子类型,需要包含头文件 <atomic>,然后声明一个 std::atomic 类型的变量。
基本用法如下:
立即学习“C++免费学习笔记(深入)”;
示例代码:
#include <atomic>
#include <iostream>
#include <thread>
#include <vector>
std::atomic<int> count{0};
void increment() {
for (int i = 0; i < 1000; ++i) {
count.fetch_add(1, std::memory_order_relaxed);
}
}
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: " << count.load() << std::endl;
return 0;
}
这个例子中,10个线程各对原子变量累加1000次,最终结果一定是10000,不会出现数据竞争。
std::atomic 提供了多种成员函数来完成不同的原子操作:
compare_exchange 示例:
std::atomic<int> value{10};
int expected = 10;
bool success = value.compare_exchange_strong(expected, 20);
// 如果 value 原来是10,则改为20,success为true
// 如果不是10,expected 被更新为实际值,success为false
原子操作可以指定内存顺序,控制操作的内存可见性和重排序行为。常见选项有:
一般情况下,若无特殊需求,使用默认的 memory_order_seq_cst 即可。
基本上就这些。std::atomic 提供了一种高效且安全的方式来处理共享数据,掌握它的基本用法和内存模型,对编写正确的并发程序至关重要。注意并不是所有类型都支持原子操作,建议使用 int、指针等基础类型,或通过 std::atomic<T> 自定义时确保 T 是平凡可复制的(trivially copyable)。
以上就是c++++怎么使用atomic实现原子操作_atomic原子操作详解的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号