跳转至

CAS

  • CAS(Compare and swap),是一种通过硬件实现并发安全的常用技术,底层通过利用 CPU 的 CAS 指令对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作最终的汇编指令中有 lock cmpxchg 指令
CAS 还是会使用锁机制,因此其它基于CAS实现的无锁队列等并不是真正意义上的无锁
title: CAS的实现思路?
CAS的思想比较简单,主要涉及到三个值:**当前内存值V**、**预期值(旧的内存值)O**、**即将更新的内存值U**,当且仅**当预期值O与当前内存值V相等时,将内存值V修改为更新值U**,并返回true,否则返回false。
title: CAS使用场景?
CAS主要使用在一些需要上锁的场景充当**乐观锁解决方案**,一般在一些简单且要上锁的操作但又不想引入锁场景,这时候来使用CAS代替锁。
title: CAS引出的问题?
ABA问题、自旋带来的消耗、CAS只能单变量
title: ABA 问题是什么?怎么解决?
- ABA 问题是指有一个线程 t1 在进行 CAS 操作时,其他线程 t2 将变量 A 改成了 B,然后又将其改成 A,这时候 t1 发现 A 并没有改变,因此进行了交换操作,由于在交换操作进行前变量 A 其实是有变化的,只不过最终又修改回 A 了,此 A 非彼 A,这时候进行交换操作在一些业务场景下很可能要出问题,要解决 ABA 问题有 2 种方案。
- 解决方法:在对变量进行操作的时候给变量加一个版本号,每次对变量操作都将版本号加 1,常见在数据库的乐观锁中可见。

1 C++CAS 接口

if (memcmp(obj, expected, sizeof *obj) == 0) {
    memcpy(obj, &desired, sizeof *obj);
    return true
} else {
    memcpy(expected, obj, sizeof *obj);
    return false;
}