原子性的定义:一个或多个操作在CPU的执行过程中,不被中断的特性叫做原子性。
我们知道引起原子性问题的原因是“线程切换”。所以如果能够禁止线程切换就解决问题了?而操作系统是依赖CPU中断做线程切换的,那么我们禁用CPU中断不就行了吗?
在单核CPU的环境下,这个答案是可行的。但是现在是多核CPU时代。在多核CPU场景下,假如同一时刻有两个线程在运行,一个线程执行在CPU-1上,一个执行在CPU-2上。那么禁止中断,只能保证线程在CPU上的连续执行,并不能保证同一个时刻只有一个线程在执行。
“同一时刻只有一个线程在执行”,这个条件非常重要,我们称之为“互斥”。如果我们能保证对共享变量的修改是互斥的,那么无论是单核CPU或者是多核CPU就能保证原子性了。
实现互斥,最容易想到就是锁。
1.简易锁模型
我们将一段需要互斥执行的代码称为临界区。在进入临界区之前,首先尝试加锁lock,如果加锁成功进入临界区,我们称这个线程持有了锁。否则就等待持有锁的线程释放锁;持有锁的线程执行完临界区的代码之后,释放锁unLock。
现在还有进一步的问题,我们锁的是什么,保护的又是什么?
2.改进之后的锁模型
解释下上图:我们把临界