概述
为什么我们需要无锁编程
多核编程中,我们常用锁来避免多个线程同时修改同一个数据时产生的条件竞争。当锁本身成为瓶颈时,我们又总想试着绕开锁,而不可避免地接触了原子指令。但在实践中,用原子指令写出正确的代码是一件非常困难的事,捉摸不透的条件竞争、ABA 问题、内存模型很烧脑。
无锁编程的相关概念
lock-free:不管OS如何调度线程,至少有一个线程在做有用的事情。
wait-free:不管OS如何调度线程,每个线程都始终在做有用的事情。
锁:OS可能把一个刚获得锁的线程切换出去,这时候所有依赖这个锁的线程都在等待,而没有做有用的事。所以,使用了锁的代码,不可能是lock-free的,更不可能是wait-free的。
如果代码中没有显式调用锁,那么它一定是lock-free的吗?答案是,不一定。假如有两个线程同时调用下面这段代码,是有可能无限循环的。
while (X == 0) // 总是同时进入
{
X = 1 - X; // 修改总是一定的先后顺序
}