base6. BlockingQueue无界缓冲区模板类、BoundedBlockingQueue有界缓冲区模板类——生产者与消费者模型

本文主要是介绍base6. BlockingQueue无界缓冲区模板类、BoundedBlockingQueue有界缓冲区模板类——生产者与消费者模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

BlockingQueue类图
在这里插入图片描述
数据成员:

mutable MutexLock mutex_:一个MutexLock类型的锁mutex_
Condition notEmpty_:一个Condition类型的信号量notEmpty_,用于通知队列非空
std::deque queue_:一个类型T的队列

成员函数:

BlockingQueue():构造函数初始化数据成员
void put(const T& x):生产者生产产品,并通知消费者队列已有产品
T take():消费者消费产品
size_t size() const:返回队列queue_的大小

BlockingQueue.h

//无界缓冲区,生产者与消费者模型
#ifndef MUDUO_BASE_BLOCKINGQUEUE_H
#define MUDUO_BASE_BLOCKINGQUEUE_H#include <muduo/base/Condition.h>
#include <muduo/base/Mutex.h>#include <boost/noncopyable.hpp>
#include <deque>
#include <assert.h>namespace muduo
{template<typename T>
class BlockingQueue : boost::noncopyable
{public://构造函数初始化数据成员BlockingQueue(): mutex_(),notEmpty_(mutex_),queue_(){}//生产者生产产品void put(const T& x){MutexLockGuard lock(mutex_);queue_.push_back(x);//通知消费者队列已有产品notEmpty_.notify(); // TODO: move outside of lock}//消费者消费产品T take(){MutexLockGuard lock(mutex_);// always use a while-loop, due to spurious wakeupwhile (queue_.empty()){notEmpty_.wait();}assert(!queue_.empty());T front(queue_.front());queue_.pop_front();return front;}//返回队列queue_的大小size_t size() const{MutexLockGuard lock(mutex_);return queue_.size();}private://一个MutexLock类型的锁mutex_mutable MutexLock mutex_;//一个Condition类型的信号量notEmpty_,用于通知队列非空Condition         notEmpty_;//一个类型T的队列std::deque<T>     queue_;
};}#endif  // MUDUO_BASE_BLOCKINGQUEUE_H

BoundedBlockingQueue类图
在这里插入图片描述
数据成员:

mutable MutexLock mutex_:一个MutexLock类型的锁mutex_
Condition notEmpty_:一个Condition类型的信号量notEmpty_,用于通知队列非空
Condition notFull_:一个Condition类型的信号量notFull_,用于通知队列未满
boost::circular_buffer queue_:一个类型T的环形缓冲区queue_,为有界缓冲区

成员函数:

BlockingQueue():构造函数初始化数据成员
void put(const T& x):生产者从queue_尾部生产产品,并通知消费者队列已有产品
T take():消费者消费产品,消费者从queue_头部消费产品,并通知生产者队列未满
bool empty() const:判断队列queue_是否是空的
bool full() const:判断队列queue_是否是满的
size_t size() const:返回queue_中当前产品的个数
size_t capacity() const:返回queue_总的容量

BoundedBlockingQueue.h

//有界缓冲区,生产者与消费者模型
#ifndef MUDUO_BASE_BOUNDEDBLOCKINGQUEUE_H
#define MUDUO_BASE_BOUNDEDBLOCKINGQUEUE_H#include <muduo/base/Condition.h>
#include <muduo/base/Mutex.h>#include <boost/circular_buffer.hpp>
#include <boost/noncopyable.hpp>
#include <assert.h>namespace muduo
{template<typename T>
class BoundedBlockingQueue : boost::noncopyable
{public:explicit BoundedBlockingQueue(int maxSize): mutex_(),notEmpty_(mutex_),notFull_(mutex_),queue_(maxSize){}//生产者生产产品void put(const T& x){MutexLockGuard lock(mutex_);while (queue_.full()){notFull_.wait();}assert(!queue_.full());//生产者从queue_尾部生产产品queue_.push_back(x);notEmpty_.notify(); // TODO: move outside of lock}//消费者消费产品T take(){MutexLockGuard lock(mutex_);while (queue_.empty()){notEmpty_.wait();}assert(!queue_.empty());//消费者从queue_头部消费产品T front(queue_.front());queue_.pop_front();notFull_.notify(); // TODO: move outside of lockreturn front;}//判断队列queue_是否是空的bool empty() const{MutexLockGuard lock(mutex_);return queue_.empty();}//判断队列queue_是否是满的bool full() const{MutexLockGuard lock(mutex_);return queue_.full();}//返回queue_中当前产品的个数size_t size() const{MutexLockGuard lock(mutex_);return queue_.size();}//返回queue_总的容量size_t capacity() const{MutexLockGuard lock(mutex_);return queue_.capacity();}private:mutable MutexLock          mutex_;Condition                  notEmpty_;//一个Condition类型的信号量notFull_,用于通知队列未满Condition                  notFull_;//一个环形缓冲区queue_,为有界缓冲区boost::circular_buffer<T>  queue_;
};}#endif  // MUDUO_BASE_BOUNDEDBLOCKINGQUEUE_H

这篇关于base6. BlockingQueue无界缓冲区模板类、BoundedBlockingQueue有界缓冲区模板类——生产者与消费者模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/795650

相关文章

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA