生产消费者模型
2017-09-13 10:09
316 查看
生产者/消费者模型
原文地址:http://blog.csdn.net/sicofield/article/details/8849392
产者/消费者模型描述如下:有一个或多个生产者生产某种类型的数据,并防止在缓冲区(可以是数组也可以是队列等数据结构)中;有一个消费者可以从缓冲区中取数据,每次取一项;系统保证避免对缓冲区的重复操作,也就是说在任何时候只有一个主体(生产者或消费者)可以访问缓冲区。问题要确保缓冲区不溢出,即当缓冲区满时,生成者不会继续向其中添加数据;当缓冲区空时,消费者不会从中移走数据。
首先列出信号量解决生产者/消费者问题的代码:
管程代码:
消息传递代码:
原文地址:http://blog.csdn.net/sicofield/article/details/8849392
产者/消费者模型描述如下:有一个或多个生产者生产某种类型的数据,并防止在缓冲区(可以是数组也可以是队列等数据结构)中;有一个消费者可以从缓冲区中取数据,每次取一项;系统保证避免对缓冲区的重复操作,也就是说在任何时候只有一个主体(生产者或消费者)可以访问缓冲区。问题要确保缓冲区不溢出,即当缓冲区满时,生成者不会继续向其中添加数据;当缓冲区空时,消费者不会从中移走数据。
首先列出信号量解决生产者/消费者问题的代码:
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个元素大小的缓冲区*/ 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); }
相关文章推荐
- 并发控制(8)使用executor并发框架来实现的生产消费者模型
- 生产消费者模型
- 深度剖析java线程安全|内存模型|生产消费者模式|
- 生产消费模型-多生产者vs多消费者
- 未完成-生产消费者模型
- Python之Queue模块以及生产消费者模型
- JAVA实现生产消费者模型
- java生产者消费者模型(线程协作)
- 并发基础 -- 生产消费者模型
- 生产消费者模型实现
- linux生产消费者模型
- Python之queue模块以及生产消费者模型
- Java多线程中不同条件下编写生产消费者模型方法介绍
- Android系统运行架构之--生产-消费者模型详解
- 生产/消费者模型的实现 —— InfoQueue
- 生产消费者模型
- 读者写者模型(概念&与生产消费者的区别¥读写优先级问题)
- 生产消费者模型
- 生产消费者模型
- pythond多线程——生产消费者模型