生产者/消费者模型 ╰半夏微凉° 2022-03-09 11:20 268阅读 0赞 产者/消费者模型描述如下:有一个或多个生产者生产某种类型的数据,并防止在缓冲区(可以是数组也可以是队列等数据结构)中;有一个消费者可以从缓冲区中取数据,每次取一项;系统保证避免对缓冲区的重复操作,也就是说在任何时候只有一个主体(生产者或消费者)可以访问缓冲区。问题要确保缓冲区不溢出,即当缓冲区满时,生成者不会继续向其中添加数据;当缓冲区空时,消费者不会从中移走数据。 首先列出信号量解决生产者/消费者问题的代码: const int sizeofbuffer = /* 缓冲区容量 */; semaphore s = 1, n = 0, e = sizeofbuffer; //s用于生产者与消费者的互斥,n用于判定缓冲区是否为空,s用于判定缓冲区是否满 void producer() { while (true) { produce(); semWait(e); semWait(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); } 管程代码: /* program producerconsumer */ monitor boundedbuffer; char buffer [N]; /*N个元素大小的缓冲区*/ int nextin, nextout; /*缓冲区指针*/ int count; /*缓冲区中可用元素个数*/ cond notfull, notempty; /*条件变量*/ void append (char x) { if (count == N) cwait(notfull); /*缓冲区满,禁止写入,防止溢出*/ buffer[nextin] = x; nextin = (nextin + 1) % N; count++; /*多了一个数据*/ csignal (nonempty); /*通知消费者,缓冲区不空,可能有消费者阻塞*/ } void take (char x) { if (count == 0) cwait(notempty); /*缓冲区空,禁止取数据,防止溢出*/ x = buffer[nextout]; nextout = (nextout + 1) % N); count--; /*数据项少了一项*/ csignal (notfull); /*通知生产者,缓冲区不满,可能有生产者阻塞*/ } { /*管程体*/ nextin = 0; nextout = 0; count = 0; /*缓冲区初始化为空*/ } void producer() { char x; while (true) { produce(x); append(x); } } void consumer() { char x; while (true) { take(x); consume(x); } } void main() { parbegin (producer, consumer); } 消息传递代码: const int capacity = /* 缓冲区容量 */ ; null = /* 空消息 */ ; int i; void producer() { message pmsg; while (true) { receive (mayproduce,pmsg); pmsg = produce(); send (mayconsume,pmsg); } } void consumer() { message cmsg; while (true) { receive (mayconsume,cmsg); consume (cmsg); send (mayproduce,null); } } void main() { create_mailbox (mayproduce); create_mailbox (mayconsume); for (int i = 1;i <= capacity;i++) send (mayproduce,null); parbegin (producer,consumer); }
还没有评论,来说两句吧...