【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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)掌握生产者-消费者的基本算法很重要,但更重要的是自己的实践

多线程的那点儿事(之生产者-消费者)相关推荐

  1. IOS 多线程编程_NSLock,NSCondition,synchronized和生产者消费者模型

    1.NSLock 线程锁, 任何两个线程访问同一共享资源(变量,数组)都需要加锁,保证同一时刻只能有一个线程访问共享资源 一个银行账户:有1000块钱,有两个线程同时做一次取钱操作,取钱的金额为800 ...

  2. 多线程的那点儿事(之大结局)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 多线程一直是我比较喜欢的话题,当然也是很多朋友比较害怕的话题.喜欢它,因为它确实可以提高pc的 ...

  3. Java基础学习之生产者消费者(29)

    1.1 生产者消费者模式概述 生产者消费者模式是一个十分经典的多线程协作模式,弄懂生产者消费者问题能够让我们对多线程编程理解更加深刻. 包含两类线程: 一类是生产者线程用于生产数据 一类是消费者线程用 ...

  4. 【C++】多线程(链式、循环队列)实现生产者消费者模式

    生产者消费者模式:         生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...

  5. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  6. java多线程生产者与消费者问题_Java多线程详解之四:生产者消费者问题

    一.问题描述 生产者消费者问题(Producer-Consumer problem),也称有限缓冲区问题(Bounded-buffer promblem),是一个多线程同步问题的经典案例.对于一个固定 ...

  7. 多生产者_多线程必考的「生产者 - 消费者」模型,看齐姐这篇文章就够了

    生产者 - 消费者模型 Producer-consumer problem 是一个非常经典的多线程并发协作的模型,在分布式系统里非常常见.也是面试中无论中美大厂都非常爱考的一个问题,对应届生问的要少一 ...

  8. Java多线程生产者消费者调度实现

    生产者消费者模型是多线程中最常见的模型,有着广泛的应用.其主要目的是实现一种动态的平衡,让生产者消费者和谐共处,获得最大化的执行效率. 所说的动态平衡其实就是生产者与消费者协作控制仓储,让消费者不至于 ...

  9. c++11 多线程传参和生产者消费者实现

    普通函数传参和成员函数传参 #include <iostream> #include <thread> #include <windows.h> void func ...

最新文章

  1. ​CPU将进入新时代:押注计算芯片的极限协同设计
  2. Selenium3自动化测试——22.使用DDT运行同一测试用例
  3. Linux下使用ls查看文件颜色全部为白色的解决方法,以及Linux中文件颜色介绍
  4. Java打乱牌的算法_Leetcode 384. 打乱数组 (洗牌算法)
  5. tensorflow打印模型图_[深度学习]TensorRT加速tensorflow实例
  6. gson读取json字符串_Java:JSON(Gson)从JSON字符串获取值
  7. 世界首块10层3D打印PCB电路板问世!
  8. 用计算机考试的时候怎么用有道词典,(图文教程)有道词典单词书
  9. 矩阵求逆的几种方法总结(C++)
  10. dell计算机的硬盘如何分区,戴尔电脑分盘怎么分区
  11. android 修改双卡铃声,Android 修改系统来电铃声
  12. 机器学习实战(一)KNN算法
  13. SQL Server Select Top语句
  14. 5号字对应的数字字号_5号字体比较于多少pt
  15. 了解App启动时间测试方法
  16. IO学习(四)文件读取与写出
  17. Redis集群批量删除key
  18. Linux上使用ZFS
  19. (论文笔记06.High Fidelity Data Reduction for Big Data Security Dependency Analyses(CCF A)2016)
  20. windows11 安装vc++6.0

热门文章

  1. “The Stupidity Paradox”作者访谈
  2. Lync 小技巧-56-检查你用的公网证书是否正确
  3. mac ipmessage
  4. Windows 7 ship party
  5. 波形捕捉:(8)使用“捕捉缓冲区”
  6. PHP 五大运行模式
  7. DlgProc对话框回调
  8. 大数据_Spark框架_快速上手_使用Idea创建Spark的Maven项目---Spark工作笔记0004
  9. AndroidStudio安卓原生开发_启动系统的activity_短信发送activity_摄像头activity_电话拨打activity---Android原生开发工作笔记94
  10. 理解认证_授权_以及会话_Spring Security OAuth2.0认证授权---springcloud工作笔记110