原子操作是不可分割的操作,能避免多线程数据竞争。std::atomic 提供原子读写、增减、比较交换等操作,默认使用顺序一致性内存序,可提升性能并替代部分锁机制,适用于计数器、状态标志等场景。
在C++并发编程中,std::atomic 是实现原子操作的核心工具。它能确保对共享变量的读写操作不会被多个线程同时修改而导致数据竞争,从而避免未定义行为。使用 atomic 可以替代部分锁机制,提升程序性能,尤其适用于计数器、状态标志等简单共享数据的场景。
原子操作是指一个操作在执行过程中不会被线程调度机制打断,整个过程“不可分割”。例如,递增一个变量(i++)通常包含读取、加1、写回三步,在多线程环境下可能多个线程同时读到相同值,导致结果错误。而原子操作保证这三步作为一个整体完成,不会被其他线程干扰。
要使用原子类型,需包含头文件 ,然后声明一个 atomic 变量:
常见原子操作函数包括:
atomic 操作可以指定内存顺序,控制操作的同步和排序行为。默认使用 memory_order_seq_cst(顺序一致性),最安全但可能影响性能。根据需要可选择更宽松的模型:
示例:使用 relaxed 内存序递增计数器
std::atomiccnt{0}; cnt.fetch_add(1, std::memory_order_relaxed);
atomic 特别适合以下情况:
注意:atomic 不支持任意类型。基本类型如 int、bool、指针等有特化版本。自定义类型需满足 trivially copyable 才能使用 std::atomic
能有效提升 C++ 多线程程序的安全性和效率。