C++多线程-生产者与消费者模型
生产者-消费者是很有意思的一种算法。它的存在主要是两个目的,第一就是满足生产者对资源的不断创造;第二就是满足消费者对资源的不断索取。当然,因为空间是有限的,所以资源既不能无限存储,也不能无限索取。
生产者的算法,
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++多线程-生产者与消费者模型相关推荐
- Java多线程案例--生产者和消费者模型(送奶人和喝奶人的故事!)
文章目录 一.进程和线程 1.进程 2.线程 3.进程与线程的区别 二.生产者和消费者模型 1.生产者消费者模式概述 2.奶箱类 3.生产者类 4.消费者类 三.测试 1.测试类(BoxDemo) 2 ...
- Linux系统编程40:多线程之基于环形队列的生产者与消费者模型
文章目录 (1)什么是信号量 (2)与信号量相关的操作 (3)基于环形队列的生产者与消费者模型-信号量(单消费者单生产者) (1)什么是信号量 前面的叙述中,我们通过锁保证了每次只有一个线程进入临界区 ...
- Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型
文章目录 (1)生产者与消费者模型概述 (2)生产者与消费者模型优点 (3)基于阻塞队列(blockingqueue)的生产者消费者模型(单消费者单生产者) (4)基于阻塞队列(blockingque ...
- 多线程模拟实现生产者/消费者模型 (借鉴)
在生产者/消费者模型中,生产者Producer负责生产数据,而消费者Consumer负责使用数据.多个生产者线程会在同一时间运行,生产数据,并放到内存中一个共享的区域.期间,多个消费者线程读取内存共享 ...
- python生产和消费模型_python queue和生产者和消费者模型
queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. classqueue.Queue(maxsize=0) #先入先出classqueue.LifoQueue(maxsi ...
- Java多线程-生产者与消费者
Java多线程生产者与消费者,准确说应该是"生产者-消费者-仓储"模型,使用了仓储,使得生产者消费者模型就显得更有说服力. 对于此模型,应该明确一下几点: 1.生产者仅仅在仓储未满 ...
- Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)
条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...
- 生产者和消费者模型介绍
一.概念引入 日常生活中,每当我们缺少某些生活用品时,我们都会去超市进行购买,那么,你有没有想过,你是以什么身份去的超市呢?相信大部分人都会说自己是消费者,确实如此,那么既然我们是消费者,又是谁替我们 ...
- java线程-从生产者和消费者模型说起
今天学习了经典的生产者和消费者模型,引起了对java线程等知识的一系列的思考. 在平时的编程中,经常遇到一个线程要产生数据,而另一个线程要处理产生出来的数据,这其实就是生产者和消费者的关系.生产者在产 ...
最新文章
- JZOJ 5662. 【GDOI2018Day1模拟4.17】尺树寸泓
- 太赞了!用200道题彻底搞定Python数据处理!
- CCNA学习指南第十一章
- 输入文字自动生成图片_原来Word还可以自动生成图片和图表目录!
- Atom飞行手册翻译: 3.5 创建主题
- pyqtSignal()
- MathType初体验——一款很好用的数学公式输入工具
- 总结几个有关国家行政区划的问题
- 2016年高校保送生拟录取名单(清华大学)
- js的document对象及操作
- 怎样快速用计算机做字处理,怎样快速处理Word表格的技巧 -电脑资料
- STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现
- 电子招投标系统源码之了解电子招标投标全流程
- CSS 3之文字样式
- Axure制作菜单栏效果
- 职场工作细节提升建议
- java/php/net/python教学评价系统设计
- 不用任何软件,批量转化图片格式png转jpg,bat脚本实现
- NS-3网络仿真平台搭建及可视化
- 含TDA7540的收音高频头软件源代码