Processes Synchronization and Semaphore

生产者-消费者实例

信号不能解决全部问题

 
notion image
举个栗子:
  1. 缓冲区满后,生产都P1生产一个item放入,进入sleep
  1. 另一个生产者P2生产一个item放入,进入sleep
  1. 消费者C执行1次循环,counter = BUFFER_SIZE - 1,发信号给P1,P1被唤醒
  1. 消费者C再执行一次循环,counter = BUFFER_SIZE - 2,P2不能被唤醒
counter所表达的含义不足以表达有几个生产者在睡眠,因此还需要信号量记录其它信息。

信号量

还是上面的栗子:
  1. 缓冲区满,P1执行进入sleep,sem = -1
  1. P2执行,P2进入sleep,sem = -2
  1. C执行1次循环,唤醒P1,sem = -1
  1. C再执行1次循环,唤醒P2, sem = 0
  1. C再执行1次循环,sem = 1
  1. P3执行,sem = 0
定义:
struct semaphore { int value; //资源个数 PCB *queue; //等待信号量的进程 } P(semaphore s); //消费资源,test V(semaphore s); //产生资源,increment