生产者-消费者实例
信号不能解决全部问题
举个栗子:
- 缓冲区满后,生产都P1生产一个item放入,进入sleep
- 另一个生产者P2生产一个item放入,进入sleep
- 消费者C执行1次循环,counter = BUFFER_SIZE - 1,发信号给P1,P1被唤醒
- 消费者C再执行一次循环,counter = BUFFER_SIZE - 2,P2不能被唤醒
counter所表达的含义不足以表达有几个生产者在睡眠,因此还需要信号量记录其它信息。
信号量
还是上面的栗子:
- 缓冲区满,P1执行进入sleep,sem = -1
- P2执行,P2进入sleep,sem = -2
- C执行1次循环,唤醒P1,sem = -1
- C再执行1次循环,唤醒P2, sem = 0
- C再执行1次循环,sem = 1
- P3执行,sem = 0
定义:
struct semaphore { int value; //资源个数 PCB *queue; //等待信号量的进程 } P(semaphore s); //消费资源,test V(semaphore s); //产生资源,increment