关于信号量的使用,关键是我们将问题的真实过程理解透彻,问题中不能同时进行的动作需要信号量的保护机制来解决。
①生产者:满了不放
②消费者:空了不拿
③生产者消费者不能同时进行动作

Int in = 0, out = 0;
Item buffer[n];
Semaphore mutex = 1, empty = n, full = 0;
void producer(){
do
{
produce an item in nextp;
...
Swait(empty, mutex) 如果不满,进入临界资源补货
buffer[in] = nextp;
in = (in+1) % n;
Ssignal(mutex, full); 放出临界资源,full数量加一
}while(true);
}
void consumer(){
do
{
Swait(full, mutex) //如果不空,进入临界资源拿货
nextp = buffer[out];
out = (out+1) mod n;
Ssignal(mutex, empty) 释放临界资源,empty加一
consume the item in nextp;
}while(true)

void main(){
parbegin
procedure();consumer();
coend;
}

注意,生产者的步骤一定是,先判断货物的数量是不是满了, 再决进不进临界资源

如果生产者的顺序是,先进入临界资源,再判定货物数量是不是满的,这个时候发现货物满了,生产者就等待消费者来拿货物, 但是消费者来的时候发现里面有人在工作就直接走了。。。。。死锁了