一、背景
利用信号量和管程解决同步互斥的问题
1.并发问题:竞争条件(竞态条件)
- 多程序并发存在大的问题
2.同步
- 线程共享公共数据的协调条件
- 包括互斥与条件同步
- 互斥:在同一时间只有一个线程可以执行临界区
3.解决同步问题正确比较难
- 需要高层次的编程抽象(如:锁)
- 从底层硬件支持编译
二、信号量
1. 抽象数据类型
1)一个整形(sem),两个原子操作
2)p() 操作:sem减一
- 如果信号量sem<0,认为执行p操作的进程需要睡眠,等待
- 如果信号量sem>0,认为执行p操作的进程可以继续执行,可以进入临界区
- 如果挡住了,就不能执行后续的程序,起到了一个阻挡的作用。
3)v() 操作:sem加一
- 如果信号量sem<=0,认为当前的进程等待在这一个信号量上面,然后会唤醒这个进程(一个或多个)
2. 属性
-
信号量是整数(有符号数)
一开始通常会设定为一个大于0的数,所以一开始执行p操作不会被阻塞。但是多