10.1 同步机制–锁
10.1.1 排查 GP 异常,理解原子操作
线程调度工作的核心内容就是线程的上下文保护+上下文恢复。
10.1.2 找出代码中的临界区、互斥、竞争条件
公共资源:
- 可以是公共内存、公共文件、公共硬件等,总之是被所有任务共享的一套资源
临界区:
- 访问公共资源的指令代码
互斥:
- 某一时刻公共资源只能被 1 个任务独享
竞争条件:
- 多个任务以非互斥的方式同时进入临界区
关中断是实现互斥最简单的方法。
10.1.3 信号量
同步一般是指合作单位之间为协作完成某项工作而共同遵守的工作步调。
信号量是计数值,Dijkstra 用 P、V 操作来表示信号量的减、增。
P、V 的意义不明朗,本书用 down、up 来代替。
up 操作:
- 将信号量的值加 1
- 唤醒在此信号量上等待的线程
down 操作:
- 判断信号量是否大于 0
- 若信号量大于 0,则将信号量减 1
- 若信号量等于 0,当前线程将自己阻塞,以此在此信号量上等待
up 操作和 down 操作都是原子操作。
若信号量的初值为 1,它的取值就只能为 0 和 1,称为二元信号量,可以利用二元信号量来实现锁。