目录
一、C++中的原子操作
原子操作概念:
原子操作是指在多线程环境中,一个操作或者一系列操作被视为不可分割的整体,即该操作从开始到结束不会被其他线程所干扰,始终以一个不可中断的单元完成。这种性质确保了即使多个线程同时访问同一共享数据,原子操作也能保证数据的一致性和完整性,不会出现数据竞争(data race)或中间状态。
在并发编程中,原子操作对于保证数据一致性、避免竞态条件至关重要。竞态条件是指由于多个线程对共享资源的访问顺序不确定而导致的结果不一致现象。例如,两个线程同时尝试增加一个共享计数器,如果没有适当的同步机制,可能会导致计数结果错误。原子操作通过内在硬件支持(如处理器的CAS指令)或编译器提供的同步原语,确保此类操作在没有外部同步(如锁)的情况下也能正确执行,从而消除竞态条件,提升并发程序的正确性和性能。
C++标准库中的原子类型与操作:
<atomic>头文件:
C++11引入了<atomic>
头文件,其中定义了std::atomic
模板类,用于声明和使用原子变量。std::atomic
支持多种数据类型,包括整型、布尔型、指针型等,例如:
- 原子整型:
std::atomic<int>
、std::atomic<unsigned long>
等。 - 原子布尔型:
std::atomic<bool>
。 - 原子指针型:
std::atomic<T*>
,其中T
是所指向的对象类型。
原子操作函数:
std::atomic
模板类提供了多种原子操作函数,用于对原子变量进行读写和比较交换等操作:
load()
:以原子方式读取原子变量的值,可以指定内存顺序。store()
:以原子方式设置原子变量的值,同样可指定内存顺序。exchange()
:以原子方式用新值替换原子变量的当前值,并返回旧值,支持内存顺序控制。compare_exchange_strong()
和compare_exchange_weak()
:原子地比较原子变量的当前值与预期值,若两者相等,则将原子变量的值更新为新值,否则保留原值。这两个函数的区别在于弱版本可能因优化原因偶尔失败,而强版本总是可靠地反映比较结果。两者都返回比较是否成功的布尔值,并可指定内存顺序。