原子操作CAS原理

25 阅读2分钟

CAS(Compare-and-Swap,比较并交换)的原理如下:

它主要涉及三个关键元素:内存中的一个位置(通常表示一个变量)、该位置预期的旧值、要设置的新值。

工作过程大致是这样的:

线程首先读取该内存位置当前的值,将其与预期的旧值进行比较。如果相等,就执行原子性的操作将新值写入该内存位置,操作成功;如果不相等,说明在此期间该值已经被其他线程修改了,操作失败,此时线程可以根据策略选择再次尝试或进行其他处理。

CAS 之所以能够实现原子操作,是因为它利用了底层硬件提供的原子指令支持,确保在比较和交换这两个动作的执行过程中不会被其他线程干扰。这种机制在多线程并发编程中非常有用,可以用于实现高效的同步和无锁算法等。

在 C++11 中,CAS(Compare and Swap)操作被称为原子操作,通过 <atomic> 头文件提供了一组原子操作的接口。以下是 C++11 提供的 CAS 接口:

  • std::atomic:模板类 std::atomic 是 C++11 提供的原子类型模板类,可以用于定义原子变量。它支持各种原子操作,包括加载、存储和交换等。

  • T std::atomic_exchange(std::atomic* obj, T desired):该函数用于原子地将 obj 中的值替换为 desired,并返回 obj 原来的值。

  • bool std::atomic_compare_exchange_weak(std::atomic* obj, T expected, T desired):该函数用于比较 obj 中的值与 expected 是否相等,如果相等,则将 obj 中的值替换为 desired,并返回 true;否则,将 expected 更新为 obj 的当前值,并返回 false

  • bool std::atomic_compare_exchange_strong(std::atomic* obj, T expected, T desired):与 std::atomic_compare_exchange_weak 类似,不同之处在于该函数使用强一致性的方式进行比较和替换操作。

这些接口提供了原子操作的基本功能,可以用于实现 CAS 操作。使用原子类型和原子操作可以确保在多线程环境中对变量的访问和修改都是原子性的,避免了数据竞争问题。