生产者消费者模式

上传人:oq****t 文档编号:1635236 上传时间:2017-06-30 格式:TXT 页数:3 大小:3.41KB
返回 下载 相关 举报
生产者消费者模式_第1页
第1页 / 共3页
生产者消费者模式_第2页
第2页 / 共3页
生产者消费者模式_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《生产者消费者模式》由会员分享,可在线阅读,更多相关《生产者消费者模式(3页珍藏版)》请在金锄头文库上搜索。

1、我们这里介绍的Producer-Consumer生产者-消费者模式是多线程设计模式中很著名的一个设计模式。说到生产者消费者问题,大部分人都不会陌生,OS课的经典问题,并且其本身就是一个计算机编程中常见的问题。对于它的应用,可以举出无数的例子,小到一个多线程程序对队列的共享互斥操作,大到目前流行的中间件产品,诸如BEA的BMQ(BEA Message Queue),IBM的MQ Serious等中间件就是将生产者消费者问题应用通用化体系化的结果。实际上,生产者消费者模式跟我们之前的多线程设计模式Guarded Suspension模式的PPL和C+实例非常相似。在计算机科学中,我们将生产者消费者

2、问题描述为:一群生产者在生产消息,并将此消息提供给消费者去消费。它们中间设了具有N个缓存区的缓冲池,生产者每次可将生产的消息 一个缓存区 ,消费者每次可将一个缓存区 的消息 出 消费。 这个 程有 个 件: 一 操作一个缓冲区 不 有其它 对 缓冲区 行操作 有 缓冲区 有 ,生产者 生产, 有 缓冲区 有一个产品,消费者 中 出 消费。这里 个 件分 对应了互斥和 。大 可以 ,生产者消费者模式就是在Guarded Suspension模式的上作了多的,Guarded Suspension模式不缓冲区的,currency1 都可以缓冲区“的消息, 是生产者消费者模式对缓冲区的作了, 缓冲区了

3、之fi,就不 了在其中“消息了。fl 说,Producer Consumer模式就是上了 等的Guarded Suspension模式,它的 个 等的 件”相,我们将Guarded Suspension模式一 ,就可以实 生产者消费者模式。/ ProducerConsumer.cpp : 应用程序的 。/#include stdafx.h#include #include #include #include using namespace Concurrency;using namespace std; class Requestpublic:Request(unsigned int nID)

4、: m_nID(nID)unsigned int getID()return m_nID;private:unsigned int m_nID;/ 队列/ 将“ 这个队列/ 这个队列中 的 行 class RequestQueuepublic:/ ,如果 前队列为 , 行等Request getRequest()bool bWait = true;while( bWait )/ 如果缓冲区中 有, 行等,wait(500);cs.lock();bWait = m_Queue.size() 0 ? false : true; cs.unlock();cs.lock();Request req =

5、 m_Queue.front();m_Queue.pop();wait(1000);coutGET: cs.unlock();return req;/ 将 队列中void setRequest(Request req)bool bWait = false;do/ 缓冲区的大小,这是生产者消费者模式 Guarded Suspension模式多“的一个 cs.lock();bWait = m_Queue.size() 5 ? false : true; if(bWait)coutWait. wait(500);cs.unlock();while(bWait);cs.lock();m_Queue.p

6、ush(req);coutSET: cs.unlock();private:critical_section cs; / 为了 队列 问的 区queue m_Queue;int _tmain(int argc, _TCHAR* argv)srand(int)time(NULL);RequestQueue queue;/ 模 多个 的, 就是生产者线程auto request = make_task( &() int nCount = 0;while(nCount20)wait(rand()%10);queue.setRequest(Request(nCount);+nCount;);/ 模 的 , 就是消费者线程auto process = make_task( &() while(true)queue.getRequest(););/ 行和 的线程task_group tg;tg.run(process);tg.run_and_wait(request);return 0;在这个例子中,生产者线程不 产生,RequestQueue中“, RequestQueue中的大于5 ,就等,不 其中“,消费者线程不 RequestQueue中 行 , queue中 有 ,它就 行等。生产者消费者模式fl 有 , 到 应用。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号