概念

生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。

321原则

  • 三种角色:生产者、消费者、仓库
  • 两种关系:生产者与生产者之间是互斥关系,消费者与消费者之间是互斥关系,生产者与消费者之间是同步与互斥关系。
    一个交易场所:仓库(这里我们用阻塞队列来表示)

优点

  • 解耦–生产者。消费者之间不直接通信,降低了耦合度。
  • 支持并发
  • 支持忙闲不均

代码实现

基于BlockingQueue的生产者消费者模型
BlockingQueue 在多线程编程中阻塞队列(Blocking Queue)是一种常用于实现生产者和消费者模型的数据结构。其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)

  //这是生产者消费者模型的代码                                                                                                                   #include<iostream>#include<queue>#include<stdlib.h>#include<pthread.h>#include<unistd.h>#define NUM 8  class BlockQueue{private:std::queue<int> q;int cap;pthread_mutex_t mutex;pthread_cond_t full;pthread_cond_t empty;private:void LockQueue()  //队列加锁{pthread_mutex_lock(&mutex);}void UnlockQueue()  //队列解锁{pthread_mutex_unlock(&mutex);}void ProductWait()  //队列满,生产者等待{pthread_cond_wait(&full,&mutex);}void ConsumeWait()  //队列空,消费者等待{pthread_cond_wait(&empty,&mutex);}void NotifyProduct()  //队列不为满时,通知生产者{pthread_cond_signal(&full);}void NotifyConsume()  //队列不为空时,通知消费者{pthread_cond_signal(&empty);}bool IsEmpty(){return (q.size() == 0 ? true : false);}bool IsFull(){                                                                                                                                          return (q.size() == cap ? true : false);}public:BlockQueue(int _cap = NUM):cap(_cap) //构造函数{pthread_mutex_init(&mutex,NULL);pthread_cond_init(&full,NULL);pthread_cond_init(&empty,NULL);} void PushData(const int &data){LockQueue();while(IsFull()) //队列满{NotifyConsume();std::cout<<"queue full,notify consume data,product stop!!"<<std::endl;ProductWait();}//队列不满,生产者插入数据,通知消费者队列中已经有数据了q.push(data);NotifyConsume();UnlockQueue();}void PopData(int &data){                                                                                                                                          LockQueue();while(IsEmpty())  //队列为空{ NotifyProduct();std::cout<<"queue empty,notify product data,consume stop!!"<<std::endl;ConsumeWait();}//队列不为空data = q.front();q.pop();NotifyProduct();UnlockQueue();}~BlockQueue(){pthread_mutex_destroy(&mutex);pthread_cond_destroy(&full);pthread_cond_destroy(&empty);}};//消费者void* consumer(void* arg){BlockQueue *bqp = (BlockQueue*)arg;int data;for(;;)                                                                                                                                      {bqp->PopData(data);std::cout<<"Consume data done: "<<data<<std::endl;}}//生产者void* producter(void* arg){BlockQueue *bqp = (BlockQueue*)arg;srand((unsigned long)time(NULL));for(;;){int data = rand()%1024;bqp->PushData(data);std::cout<<"Product data done: "<<data<<std::endl;// sleep(1);}}int main(){BlockQueue bq;pthread_t c,p;pthread_create(&c,NULL,consumer,(void*)&bq);pthread_create(&p,NULL,producter,(void*)&bq);pthread_join(c,NULL);pthread_join(p,NULL);return 0;}

转载自:传送门

生产者消费者模型——C语言代码详解相关推荐

  1. BilSTM 实体识别_NLP-入门实体命名识别(NER)+Bilstm-CRF模型原理Pytorch代码详解——最全攻略

    最近在系统地接触学习NER,但是发现这方面的小帖子还比较零散.所以我把学习的记录放出来给大家作参考,其中汇聚了很多其他博主的知识,在本文中也放出了他们的原链.希望能够以这篇文章为载体,帮助其他跟我一样 ...

  2. BilSTM 实体识别_NLP入门实体命名识别(NER)+BilstmCRF模型原理Pytorch代码详解——最全攻略...

    来自 | 知乎   作者 | seven链接 | https://zhuanlan.zhihu.com/p/79552594编辑 | 机器学习算法与自然语言处理公众号本文仅作学术分享,如有侵权,请联系 ...

  3. PointNet模型的Pytorch代码详解

    前言 关于PointNet模型的构成.原理.效果等等论文部分内容,我在之前一篇论文中写到过,可以参考这个链接:PointNet论文笔记    下边我就直接放一张网络组成图,并对代码进行解释,我以一种比 ...

  4. 一文读懂经典卷积网络模型——LeNet-5模型(附代码详解、MNIST数据集)

    欢迎关注微信公众号[计算机视觉联盟] 获取更多前沿AI.CV资讯 LeNet-5模型是Yann LeCun教授与1998年在论文Gradient-based learning applied to d ...

  5. GY39传感器C语言代码,详解Arduino GY-30数字光强传感器应用

    描述 数字传感器 数字传感器是指将传统的模拟式传感器经过加装或改造A/D转换模块,使之输出信号为数字量(或数字编码)的传感器,主要包括:放大器.A/D转换器.微处理器(CPU).存储器.通讯接口.温度 ...

  6. 生产者/消费者模型详解(基于Java)

    title: 生产者消费者模型 tags: 多线程 synchronized 锁 wait() notify() 生产者/消费者模型原理以及代码实现 一.生产者/消费者模型原理 所谓的生产者消费者模型 ...

  7. 【C++】【设计模式之】生产者-消费者模型(理论讲解及实现)

    一.什么是生产者-消费者模型 1.简单理解生产者-消费者模型 假设有两个进程(或线程)A.B和一个固定大小的缓冲区,A进程生产数据放入缓冲区,B进程从缓冲区中取出数据进行计算,这就是一个简单的生产者- ...

  8. 生产者消费者模型---详解及代码实现

    概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者 ...

  9. python 生产消费者_python之生产者消费者模型实现详解

    代码及注释如下 #Auther Bob #--*--conding:utf-8 --*-- #生产者消费者模型,这里的例子是这样的,有一个厨师在做包子,有一个顾客在吃包子,有一个服务员在储存包子,这个 ...

最新文章

  1. ibm750服务器维护,IBM 750服务器.PDF
  2. HighNewTech:LL / GCP BOOTH at CES 2019 - January 8-11, 2019 - Westgate Convention Center Las Vegas
  3. sping中@import
  4. 写给大数据开发初学者的话 | 附教程
  5. Linux Redhat5.7系统配置网易的yum源
  6. 答应我不要问TCP三次握手四次挥手
  7. centos7配置jdk1.8环境变量
  8. html模板安装到织梦,织梦网站安装教程 织梦模板通用安装图文教程
  9. Inversion of Control(控制反转)之 Dependency Injection(依赖注入)
  10. LeetCode每日一题:2.两数相加
  11. Java中double类型四舍五入的方法总结
  12. 电磁感应理论之父,法拉第传奇
  13. javascript之复习(框架里的方法们)
  14. 多元统计分析朱建平pdf_应用多元统计分析课后答案朱建平版[精心整理].doc
  15. linux 搭建svn注意事项
  16. 马尔可夫随机场 MRF
  17. ArcGIS地理配准(Georeferencing)详解
  18. 编译原理 实验三 逆波兰式的生成及计算程序
  19. ESP32 串口读取 jy901s 姿态传感器
  20. Conda环境无法激活

热门文章

  1. Python 位运算的操作
  2. Timeline以及自定义轨道(对话轨道)
  3. cuisineroyale服务器所在位置,cuisine royale配置要求是什么?最低配置要求介绍
  4. delphi 类class自定义类方法虚方法
  5. JDK 1.8 Sream 分组的使用
  6. 分布式缓存Memcached之Java使用篇
  7. Linux服务器查看外网IP地址的命令
  8. 成为微软MVP一年体会:反思、怀疑、成长
  9. 如何在vue项目中使用lodop打印插件
  10. matlab中sub2ind方法的使用