多线程的那点儿事(之生产者-消费者)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
生产者-消费者是很有意思的一种算法。它的存在主要是两个目的,第一就是满足生产者对资源的不断创造;第二就是满足消费者对资源的不断索取。当然,因为空间是有限的,所以资源既不能无限存储,也不能无限索取。
生产者的算法,
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)掌握生产者-消费者的基本算法很重要,但更重要的是自己的实践
多线程的那点儿事(之生产者-消费者)相关推荐
- IOS 多线程编程_NSLock,NSCondition,synchronized和生产者消费者模型
1.NSLock 线程锁, 任何两个线程访问同一共享资源(变量,数组)都需要加锁,保证同一时刻只能有一个线程访问共享资源 一个银行账户:有1000块钱,有两个线程同时做一次取钱操作,取钱的金额为800 ...
- 多线程的那点儿事(之大结局)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 多线程一直是我比较喜欢的话题,当然也是很多朋友比较害怕的话题.喜欢它,因为它确实可以提高pc的 ...
- Java基础学习之生产者消费者(29)
1.1 生产者消费者模式概述 生产者消费者模式是一个十分经典的多线程协作模式,弄懂生产者消费者问题能够让我们对多线程编程理解更加深刻. 包含两类线程: 一类是生产者线程用于生产数据 一类是消费者线程用 ...
- 【C++】多线程(链式、循环队列)实现生产者消费者模式
生产者消费者模式: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...
- java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...
导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...
- java多线程生产者与消费者问题_Java多线程详解之四:生产者消费者问题
一.问题描述 生产者消费者问题(Producer-Consumer problem),也称有限缓冲区问题(Bounded-buffer promblem),是一个多线程同步问题的经典案例.对于一个固定 ...
- 多生产者_多线程必考的「生产者 - 消费者」模型,看齐姐这篇文章就够了
生产者 - 消费者模型 Producer-consumer problem 是一个非常经典的多线程并发协作的模型,在分布式系统里非常常见.也是面试中无论中美大厂都非常爱考的一个问题,对应届生问的要少一 ...
- Java多线程生产者消费者调度实现
生产者消费者模型是多线程中最常见的模型,有着广泛的应用.其主要目的是实现一种动态的平衡,让生产者消费者和谐共处,获得最大化的执行效率. 所说的动态平衡其实就是生产者与消费者协作控制仓储,让消费者不至于 ...
- c++11 多线程传参和生产者消费者实现
普通函数传参和成员函数传参 #include <iostream> #include <thread> #include <windows.h> void func ...
最新文章
- ​CPU将进入新时代:押注计算芯片的极限协同设计
- Selenium3自动化测试——22.使用DDT运行同一测试用例
- Linux下使用ls查看文件颜色全部为白色的解决方法,以及Linux中文件颜色介绍
- Java打乱牌的算法_Leetcode 384. 打乱数组 (洗牌算法)
- tensorflow打印模型图_[深度学习]TensorRT加速tensorflow实例
- gson读取json字符串_Java:JSON(Gson)从JSON字符串获取值
- 世界首块10层3D打印PCB电路板问世!
- 用计算机考试的时候怎么用有道词典,(图文教程)有道词典单词书
- 矩阵求逆的几种方法总结(C++)
- dell计算机的硬盘如何分区,戴尔电脑分盘怎么分区
- android 修改双卡铃声,Android 修改系统来电铃声
- 机器学习实战(一)KNN算法
- SQL Server Select Top语句
- 5号字对应的数字字号_5号字体比较于多少pt
- 了解App启动时间测试方法
- IO学习(四)文件读取与写出
- Redis集群批量删除key
- Linux上使用ZFS
- (论文笔记06.High Fidelity Data Reduction for Big Data Security Dependency Analyses(CCF A)2016)
- windows11 安装vc++6.0
热门文章
- “The Stupidity Paradox”作者访谈
- Lync 小技巧-56-检查你用的公网证书是否正确
- mac ipmessage
- Windows 7 ship party
- 波形捕捉:(8)使用“捕捉缓冲区”
- PHP 五大运行模式
- DlgProc对话框回调
- 大数据_Spark框架_快速上手_使用Idea创建Spark的Maven项目---Spark工作笔记0004
- AndroidStudio安卓原生开发_启动系统的activity_短信发送activity_摄像头activity_电话拨打activity---Android原生开发工作笔记94
- 理解认证_授权_以及会话_Spring Security OAuth2.0认证授权---springcloud工作笔记110