CAS实现无锁队列
悲观锁:阻塞线程,等待锁释放,发生上下文切换
乐观锁:修改时检查,失败则不断重试
汇编原子操作:
1 | int inc(int* value, int add) { |
CAS
c++标准库提供了原子操作模板atomic
原子性:计算机执行的一条不可分割的指令
原理:compare-and-swap
- 读取旧值A
- 比较新值V
- 交换新值B
- 返回true,否则false
C++STL提供一组跨平台的CAS操作
1 | bool std::atomic<T>::compare_exchange_weak(T &expected, T desired); |
优势
- 一种乐观锁,非阻塞,不需要额外开销
- 有硬件实现,不需要互斥
问题:
- ABA问题:在CAS期间,A->B->A,CAS检查不出来,可实现带时间戳的类型
- 多线程同时更新导致循环时间过长