生产者/消费者问题

来源:互联网 发布:淘宝护肤品禁用词 编辑:程序博客网 时间:2024/06/07 12:12

这里写图片描述
用抽象的术语,定义如下的生产者和消费者函数:

producerwhile(true) {/* produce item v */;b[in]=v;in+=;}
consumerwhile(true) {while(in<=out)/* do nothing*/;w=b[out];out++;/*consume item w */;}

下图是缓冲区b的结构:
这里写图片描述

使用二元信号量解决无限缓冲区生产者/消费者模型

int n;binary_semaphore s=1,delay=0;void priducer(){while (true) {produce();semWaitB(s);append();n++;if (n==1)semSignalB(delay);semSignalB(s);}}void consumer(){int m;semWaitB(delay);while(true){semWaitB(s);take();n--;m=n;semSignalB(s);consume();if(m==0)semWaitB(delay);}}void main(){n=0;parbegin (producer,consumer);}

使用信号量解决无限缓冲区 生产者/消费者模型

semaphore n=0,s=1;void producer(){whiletrue){produce();semWaitB(s);append();semSignal(s);semSignal(n);}}void consumer(){while(true){semWait(n);semWait(s);take();semSignal(s);consume();}}void main(){parbegin (producer,consumer);}

下面,我们给生产者/消费者模型增加一个新的实际约束:
缓冲区是有限的。
这里写图片描述
使用信号量解决有限缓冲区生产者/消费者模型

const int sizeofbuffer = /*缓冲区大小*/;semaphore s=1,n=0,e=sizeofbuffer;void producer(){while(ture){produce();semWait(e);semWaita(s);append();semSignal(s);semSignal(n);}}void consumer(){while(true){semWait(n);semWait(s);take();semSignal(s);semSignal(e);consume();}}void main(){parbegin (producer,consumer);}