生产者-消费者是很有意思的一种算法。它的存在主要是两个目的,第一就是满足生产者对资源的不断创造;第二就是满足消费者对资源的不断索取。当然,因为空间是有限的,所以资源既不能无限存储,也不能无限索取。

生产者的算法,

WaitForSingleObject(hEmpty, INFINITE);
WaitForSingleObject(hMutex, INIFINITE);
/* produce new resources */
ReleaseMutex(hMutex);
ReleaseSemaphore(hFull, 1, NULL);

消费者的算法,

WaitForSingleObject(hFull, INFINITE);
WaitForSingleObject(hMutex, INIFINITE);
/* consume old resources */
ReleaseMutex(hMutex);
ReleaseSemaphore(hEmpty, 1, NULL);

那么,有的朋友可能会说了,这么一个生产者-消费者算法有什么作用呢。我们可以看看它在多线程通信方面是怎么发挥作用的?首先我们定义一个数据结构,

typedef struct _MESSAGE_QUEUE
{  int threadId;  int msgType[MAX_NUMBER];  int count;  HANDLE hFull;  HANDLE hEmpty;  HANDLE hMutex;
}MESSAGE_QUEUE;

那么,此时如果我们需要对一个线程发送消息,该怎么发送呢,其实很简单。我们完全可以把它看成是一个生产者的操作。

void send_mseesge(int threadId, MESSAGE_QUEUE* pQueue, int msg)
{  assert(NULL != pQueue);  if(threadId != pQueue->threadId)  return;  WaitForSingleObject(pQueue->hEmpty, INFINITE);  WaitForSingleObject(pQueue->hMutex, INFINITE);  pQueue->msgType[pQueue->count ++] = msg;  ReleaseMutex(pQueue->hMutex);  ReleaseSemaphore(pQueue->hFull, 1, NULL);
}

既然前面说到发消息,那么线程自身就要对这些消息进行处理了。

void get_message(MESSAGE_QUEUE* pQueue, int* msg)
{  assert(NULL != pQueue && NULL != msg);  WaitForSingleObject(pQueue->hFull, INFINITE);  WaitForSingleObject(pQueue->hMutex, INFINITE);  *msg = pQueue->msgType[pQueue->count --];  ReleaseMutex(pQueue->hMutex);  ReleaseSemaphore(pQueue->hEmpty, 1, NULL);
}

总结:
(1)生产者-消费者只能使用semphore作为锁
(2)编写代码的时候需要判断hFull和hEmpty的次序
(3)掌握生产者-消费者的基本算法很重要,但更重要的是自己的实践

C++多线程-生产者与消费者模型相关推荐

  1. Java多线程案例--生产者和消费者模型(送奶人和喝奶人的故事!)

    文章目录 一.进程和线程 1.进程 2.线程 3.进程与线程的区别 二.生产者和消费者模型 1.生产者消费者模式概述 2.奶箱类 3.生产者类 4.消费者类 三.测试 1.测试类(BoxDemo) 2 ...

  2. Linux系统编程40:多线程之基于环形队列的生产者与消费者模型

    文章目录 (1)什么是信号量 (2)与信号量相关的操作 (3)基于环形队列的生产者与消费者模型-信号量(单消费者单生产者) (1)什么是信号量 前面的叙述中,我们通过锁保证了每次只有一个线程进入临界区 ...

  3. Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型

    文章目录 (1)生产者与消费者模型概述 (2)生产者与消费者模型优点 (3)基于阻塞队列(blockingqueue)的生产者消费者模型(单消费者单生产者) (4)基于阻塞队列(blockingque ...

  4. 多线程模拟实现生产者/消费者模型 (借鉴)

    在生产者/消费者模型中,生产者Producer负责生产数据,而消费者Consumer负责使用数据.多个生产者线程会在同一时间运行,生产数据,并放到内存中一个共享的区域.期间,多个消费者线程读取内存共享 ...

  5. python生产和消费模型_python queue和生产者和消费者模型

    queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. classqueue.Queue(maxsize=0) #先入先出classqueue.LifoQueue(maxsi ...

  6. Java多线程-生产者与消费者

    Java多线程生产者与消费者,准确说应该是"生产者-消费者-仓储"模型,使用了仓储,使得生产者消费者模型就显得更有说服力. 对于此模型,应该明确一下几点: 1.生产者仅仅在仓储未满 ...

  7. Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)

    条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...

  8. 生产者和消费者模型介绍

    一.概念引入 日常生活中,每当我们缺少某些生活用品时,我们都会去超市进行购买,那么,你有没有想过,你是以什么身份去的超市呢?相信大部分人都会说自己是消费者,确实如此,那么既然我们是消费者,又是谁替我们 ...

  9. java线程-从生产者和消费者模型说起

    今天学习了经典的生产者和消费者模型,引起了对java线程等知识的一系列的思考. 在平时的编程中,经常遇到一个线程要产生数据,而另一个线程要处理产生出来的数据,这其实就是生产者和消费者的关系.生产者在产 ...

最新文章

  1. JZOJ 5662. 【GDOI2018Day1模拟4.17】尺树寸泓
  2. 太赞了!用200道题彻底搞定Python数据处理!
  3. CCNA学习指南第十一章
  4. 输入文字自动生成图片_原来Word还可以自动生成图片和图表目录!
  5. Atom飞行手册翻译: 3.5 创建主题
  6. pyqtSignal()
  7. MathType初体验——一款很好用的数学公式输入工具
  8. 总结几个有关国家行政区划的问题
  9. 2016年高校保送生拟录取名单(清华大学)
  10. js的document对象及操作
  11. 怎样快速用计算机做字处理,怎样快速处理Word表格的技巧 -电脑资料
  12. STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现
  13. 电子招投标系统源码之了解电子招标投标全流程
  14. CSS 3之文字样式
  15. Axure制作菜单栏效果
  16. 职场工作细节提升建议
  17. java/php/net/python教学评价系统设计
  18. 不用任何软件,批量转化图片格式png转jpg,bat脚本实现
  19. NS-3网络仿真平台搭建及可视化
  20. 含TDA7540的收音高频头软件源代码

热门文章

  1. openGrok手动更新索引的方法
  2. 农民伯伯的题难倒千万清北学生——才怪
  3. 淘宝搜索排序算法分析
  4. 小学生图解排序算法:③直接插入排序
  5. 【论文阅读】一些研究想法
  6. php反射型xss,反射型XSS测试及修复
  7. 重启计算机设的桌面背景就没了,电脑重启后壁纸消失如何解决
  8. 弹性力学——一些知识
  9. linux查看cpu是否支持虚拟化,如何知道CPU是否支持虚拟化技术(VT)
  10. kafka 消费者详解