<p>std::atomic 是 C++ 中用于实现多线程环境下原子操作的核心工具,确保对共享变量的读、写和复合操作不可分割,避免数据竞争。原子操作指操作在执行中不会被中断,要么完全执行,要么不执行,无中间状态。例如,多个线程同时对普通变量进行 i++ 操作可能导致结果错误,因其包含“读-改-写”三步,而使用 std::atomic<int> 可保证该操作原子性,结果正确。常见用法包括 std::atomic<int> counter{0}、std::atomic<bool> ready{false} 等,支持整型、指针等类型。主要操作有 load()(原子读)、store(val)(原子写)、exchange(val)(替换并返回旧值)、compare_exchange_weak/strong(比较并交换,CAS,用于无锁编程)、fetch_add()/fetch_sub()(原子加减并返回原值),且对整型和指针支持 ++、-- 运算符重载。示例代码中两个线程各对 atomic 变量自增 1000 次,最终结果为 2000,体现其正确性。内存序(Memory Order)控制原子操作的同步行为与性能,默认为 std::memory_order_seq_cst(顺序一致性,最安全但性能较低)。其他选项包括 memory_order_relaxed(仅保证</p>

std::atomic 是 C++ 中用于实现原子操作的核心工具,它能确保对共享数据的操作在多线程环境下不会出现数据竞争,从而保证并发安全。简单来说,使用 std::atomic 的变量,其读、写或复合操作(如自增)是“不可分割”的——其他线程无法观察到中间状态。
原子操作是指一个操作在执行过程中不会被线程调度机制打断。也就是说,该操作要么完全执行,要么完全不执行,不存在部分完成的状态。在多线程编程中,多个线程同时访问同一变量时,如果没有同步机制,就会导致未定义行为。
例如,两个线程同时对一个普通整型变量执行 i++,由于 i++ 实际包含“读-改-写”三个步骤,可能两个线程都读取了旧值,各自加1后再写回去,最终只加了一次,造成数据丢失。
而如果这个变量是 std::atomic<int> 类型,则 ++ 操作会以原子方式完成,结果正确。
你可以将 std::atomic 用于整型、指针等支持原子操作的类型:
常用操作包括:
++、-- 等运算符重载示例代码:
立即学习“C++免费学习笔记(深入)”;
#include <atomic>
#include <thread>
#include <iostream>
std::atomic<int> count{0};
void increment() {
for (int i = 0; i < 1000; ++i) {
count.fetch_add(1);
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Final count: " << count.load() << "\n"; // 输出 2000
}
std::atomic 操作允许指定内存序,用来控制操作的内存同步行为。默认使用 std::memory_order_seq_cst(顺序一致性),最安全但可能影响性能。
常见内存序选项:
例如:
count.store(1, std::memory_order_release); int val = count.load(std::memory_order_acquire);
这种配对常用于实现自定义同步机制,如自旋锁或无锁队列。
std::atomic 并非万能,使用时需注意:
基本上就这些。std::atomic 提供了高效且灵活的并发控制手段,尤其适用于轻量级同步场景。掌握它,是写出高性能、线程安全 C++ 代码的重要一步。
以上就是c++++中std::atomic是什么_c++原子操作与并发安全讲解的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号