为应对系统的通信上消息收发的高耦合度,在接受和发送消息后设计一个缓存队列,并使用多线程生产者-消费者来进行收发解耦。避免通信上的拥堵情况。
利用C++内置函数实现生产者-消费者功能:

private:std::deque<T> queue_; //缓存队列size_t size_limit_;  //缓存队列大小的限制std::mutex lock_;  //互斥锁std::condition_variable empty_, full_;  //并发条件变量类std::atomic<int> producer_num_;  //生产者数量

实现思路是:当缓存队列满的时候,生产者将被挂起,直到队列重新拥有空间。但缓存队列为空时,消费者线程将被挂起,直到有“商品”被放入队列之中。

void Productor(T& item) {{std::unique_lock<std::mutex> lk(lock_); //加锁防止冲突while (queue_.size() >= size_limit_) {full_.wait(lk);}queue_.emplace_back(item);}empty_.notify_one();}

full_.wait(lk)在queue队列满时将会把Productor挂起,直到queue有空间放入新的item。notify_one方法任意从WAITTING状态的线程中挑选一个进行通知,使得调用wait()方法的线程从等待队列移入到同步队列中,等待有机会再一次获取到锁,从而使得调用wait()方法的线程能够从wait()方法处退出。

  bool Consumer(T& item) {{std::unique_lock<std::mutex> lk(lock_);while (queue_.empty() && (producer_num_ != 0)) {empty_.wait(lk);}if (queue_.empty() && (producer_num_ == 0)) {return false;} else {item = std::move(queue_.front());queue_.pop_front();full_.notify_one();return true;}}}

同理,empty_.wait(lk)会在生产者数量为0或者队列queue为空的时候,将Consumer挂起。直到有商品进入到队列中。这样就可以实现一个简单的生产者消费者。

C++实现生产者消费者相关推荐

  1. RabbitMQ 入门系列(3)— 生产者消费者 Python 代码实现

    生产者消费者代码示例 上一章节中对消息通信概念做了详细的说明,本章节我们对 RabbitMQ 生产者和消费者代码分别做一示例说明. 1. 生产者代码 #!/usr/bin/env python # c ...

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

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

  3. 面试官让我手写一个生产者消费者模式?

    不知道你是否遇到过面试官让你手写生产者消费者代码.别说,前段时间有小伙伴还真的遇到了这种情况,当时是一脸懵逼. 但是,俗话说,从哪里跌倒就要从哪里爬起来.既然这次被问到了,那就回去好好研究一下,争取下 ...

  4. windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现

    生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例. 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗 ...

  5. 基于队列的生产消费设计java_生产者-消费者设计模式

    一.生产者消费者设计模式 1.中间队列 一段内存空间,且可存取: 2.两种角色 (1)生产者:生产数据: (2)消费者:消费数据. 3.三种关系 (1)生产者与生产者的互斥关系: (2)消费者与消费者 ...

  6. 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来

    题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...

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

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

  8. java线程模拟生产者消费者问题

    所谓的生产者消费者问题,就是存在生产者和消费者两个线程,当仓库还没满的时候,生产者可以生产,当仓库没空的时候,消费者可以取走商品. 我们用实例说话: 下面,我们创建几个类: 1.消费者--主要负责消费 ...

  9. 图文并茂的生产者消费者应用实例demo

    前面的几篇文章<<.NET 中的阻塞队列BlockingCollection的正确打开方式>><<项目开发中应用如何并发处理的一二事>>从代码以及理论角 ...

  10. linux使用线程实现生产者消费者问题,Linux平台下线程同步,实现“生产者消费者问题”...

    (1)线程同步,实现"生产者消费者问题" 要求:缓冲区大小为20,生产者每次放一个产品,消费者每次取走一个产品:生产者和消费者至少2个. (2)代码如下: #include #in ...

最新文章

  1. 皮纹生物识别多元智力测量的科学原理
  2. 幅度响应怎么计算_广播百科 频率响应
  3. ubuntu 16.04 LTS 搜狗输入法安装
  4. 异步加载 防止图片混乱
  5. Hibernate的@Temporal注解处理时间日期类型的映射关系
  6. BFS,优先队列优化
  7. 【转】ABP源码分析三十八: ABP.Web.Api.OData
  8. 2020年中国网络安全市场全景图
  9. python模拟app抢票_亲测,手把手教你用Python抢票
  10. 转载:Windows Phone 7 资源汇总(超全)
  11. 子域收集-fierce
  12. 卸载mysql server_windows中彻底卸载mysql
  13. 利用QT写的局域网聊天工具(客户端)
  14. 梅花雪MzTreeView2.0 的checkbox完全攻略
  15. miredo - Teredo IPv6 tunneling for Unix
  16. java socketacceptor_rsocket-java小试牛刀
  17. label 字体添加中划线和下划线
  18. NEON----ARM通用 SIMD 引擎
  19. LeetCode 力扣算法题解汇总,All in One
  20. Metal(二) Metal语法规范

热门文章

  1. linux 中的代码如何编译错误提示,Ubuntu 下GCC编译代码错误提示没有system.h和conio.h,如何得到这两个文件...
  2. python、cpython、IPython、Jython区别
  3. Grizzly和Netty以及Mina简单性能对比
  4. python-获取汉字注音
  5. Smartbi:财务人的福音,原来企业财务报表分析还能这样做
  6. 雷蛇灯光配置文件_信仰绿轴?雷蛇RAZER黑寡妇蜘蛛X竞技版(背光款)点评
  7. 【使用技巧】如何在RT-Thread Studio上使用GIT进行工程管理
  8. postgres的时间转换
  9. 触觉智能分享-Android ADB工具使用
  10. 高仿小刀娱乐网系统源码+积分功能+前台投稿