2022-2-8
- 锁
-
- 休眠代替自旋
锁
为了让自旋锁不要浪费太多时间在自旋上,最简单的方法就是让线程自旋的时候让出cpu
但这里也有个问题,当一个进程有100个线程,且采用轮转调度,那么一个线程持有锁,其他99个线程调用锁,发现被占用然后让出cpu,虽然比一直自旋要更有效率,但99个上下文切换也是很耗时间的
休眠代替自旋
为了防止前文提到的多个上下文切换,我们使用队列记录下一个应该持有锁的线程
这里的flag表示的是锁是否正在被使用,guard表示锁是否正在被其他人读取,当最开始没人使用的时候,flag和guard都为0,一个线程进入,将flag改为1,guard保持为0,然后执行自己在临界区的操作,这时发生中断,另一个线程进入,发现flag为1,表示锁正在被使用,于是这个线程将自己的序列号写入队列,并把guard设为0,将锁的读取权利让出去,然后进入休眠,等待正在使用锁的线程unloc并唤醒自己
我们注意到这里唤醒下一个线程的时候,flag没有被置0,这是对的,因为线程被唤醒后紧接着park的位置继续执行,所以锁一直是在被使用的