C++实现生产者消费者
为应对系统的通信上消息收发的高耦合度,在接受和发送消息后设计一个缓存队列,并使用多线程生产者-消费者来进行收发解耦。避免通信上的拥堵情况。
利用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++实现生产者消费者相关推荐
- RabbitMQ 入门系列(3)— 生产者消费者 Python 代码实现
生产者消费者代码示例 上一章节中对消息通信概念做了详细的说明,本章节我们对 RabbitMQ 生产者和消费者代码分别做一示例说明. 1. 生产者代码 #!/usr/bin/env python # c ...
- 【C++】多线程(链式、循环队列)实现生产者消费者模式
生产者消费者模式: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...
- 面试官让我手写一个生产者消费者模式?
不知道你是否遇到过面试官让你手写生产者消费者代码.别说,前段时间有小伙伴还真的遇到了这种情况,当时是一脸懵逼. 但是,俗话说,从哪里跌倒就要从哪里爬起来.既然这次被问到了,那就回去好好研究一下,争取下 ...
- windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现
生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例. 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗 ...
- 基于队列的生产消费设计java_生产者-消费者设计模式
一.生产者消费者设计模式 1.中间队列 一段内存空间,且可存取: 2.两种角色 (1)生产者:生产数据: (2)消费者:消费数据. 3.三种关系 (1)生产者与生产者的互斥关系: (2)消费者与消费者 ...
- 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来
题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...
- 生产者/消费者模型详解(基于Java)
title: 生产者消费者模型 tags: 多线程 synchronized 锁 wait() notify() 生产者/消费者模型原理以及代码实现 一.生产者/消费者模型原理 所谓的生产者消费者模型 ...
- java线程模拟生产者消费者问题
所谓的生产者消费者问题,就是存在生产者和消费者两个线程,当仓库还没满的时候,生产者可以生产,当仓库没空的时候,消费者可以取走商品. 我们用实例说话: 下面,我们创建几个类: 1.消费者--主要负责消费 ...
- 图文并茂的生产者消费者应用实例demo
前面的几篇文章<<.NET 中的阻塞队列BlockingCollection的正确打开方式>><<项目开发中应用如何并发处理的一二事>>从代码以及理论角 ...
- linux使用线程实现生产者消费者问题,Linux平台下线程同步,实现“生产者消费者问题”...
(1)线程同步,实现"生产者消费者问题" 要求:缓冲区大小为20,生产者每次放一个产品,消费者每次取走一个产品:生产者和消费者至少2个. (2)代码如下: #include #in ...
最新文章
- 皮纹生物识别多元智力测量的科学原理
- 幅度响应怎么计算_广播百科 频率响应
- ubuntu 16.04 LTS 搜狗输入法安装
- 异步加载 防止图片混乱
- Hibernate的@Temporal注解处理时间日期类型的映射关系
- BFS,优先队列优化
- 【转】ABP源码分析三十八: ABP.Web.Api.OData
- 2020年中国网络安全市场全景图
- python模拟app抢票_亲测,手把手教你用Python抢票
- 转载:Windows Phone 7 资源汇总(超全)
- 子域收集-fierce
- 卸载mysql server_windows中彻底卸载mysql
- 利用QT写的局域网聊天工具(客户端)
- 梅花雪MzTreeView2.0 的checkbox完全攻略
- miredo - Teredo IPv6 tunneling for Unix
- java socketacceptor_rsocket-java小试牛刀
- label 字体添加中划线和下划线
- NEON----ARM通用 SIMD 引擎
- LeetCode 力扣算法题解汇总,All in One
- Metal(二) Metal语法规范
热门文章
- linux 中的代码如何编译错误提示,Ubuntu 下GCC编译代码错误提示没有system.h和conio.h,如何得到这两个文件...
- python、cpython、IPython、Jython区别
- Grizzly和Netty以及Mina简单性能对比
- python-获取汉字注音
- Smartbi:财务人的福音,原来企业财务报表分析还能这样做
- 雷蛇灯光配置文件_信仰绿轴?雷蛇RAZER黑寡妇蜘蛛X竞技版(背光款)点评
- 【使用技巧】如何在RT-Thread Studio上使用GIT进行工程管理
- postgres的时间转换
- 触觉智能分享-Android ADB工具使用
- 高仿小刀娱乐网系统源码+积分功能+前台投稿