线程安全的队列

学习一下别人写的,线程安全的队列代码。https://github.com/markparticle/WebServer/blob/master/code/log/blockqueue.hicon-default.png?t=N7T8https://github.com/markparticle/WebServer/blob/master/code/log/blockqueue.h

/** @Author       : mark* @Date         : 2020-06-16* @copyleft Apache 2.0*/ 
#ifndef BLOCKQUEUE_H
#define BLOCKQUEUE_H#include <mutex>
#include <deque>
#include <condition_variable>
#include <sys/time.h>template<class T>
class BlockDeque {
public:explicit BlockDeque(size_t MaxCapacity = 1000);~BlockDeque();void clear();bool empty();bool full();void Close();size_t size();size_t capacity();T front();T back();void push_back(const T &item);void push_front(const T &item);bool pop(T &item);bool pop(T &item, int timeout);void flush();private:std::deque<T> deq_;size_t capacity_;std::mutex mtx_;bool isClose_;std::condition_variable condConsumer_;std::condition_variable condProducer_;
};template<class T>
BlockDeque<T>::BlockDeque(size_t MaxCapacity) :capacity_(MaxCapacity) {assert(MaxCapacity > 0);isClose_ = false;
}template<class T>
BlockDeque<T>::~BlockDeque() {Close();
};template<class T>
void BlockDeque<T>::Close() {{   std::lock_guard<std::mutex> locker(mtx_);deq_.clear();isClose_ = true;}condProducer_.notify_all();condConsumer_.notify_all();
};template<class T>
void BlockDeque<T>::flush() {condConsumer_.notify_one();
};template<class T>
void BlockDeque<T>::clear() {std::lock_guard<std::mutex> locker(mtx_);deq_.clear();
}template<class T>
T BlockDeque<T>::front() {std::lock_guard<std::mutex> locker(mtx_);return deq_.front();
}template<class T>
T BlockDeque<T>::back() {std::lock_guard<std::mutex> locker(mtx_);return deq_.back();
}template<class T>
size_t BlockDeque<T>::size() {std::lock_guard<std::mutex> locker(mtx_);return deq_.size();
}template<class T>
size_t BlockDeque<T>::capacity() {std::lock_guard<std::mutex> locker(mtx_);return capacity_;
}template<class T>
void BlockDeque<T>::push_back(const T &item) {std::unique_lock<std::mutex> locker(mtx_);while(deq_.size() >= capacity_) {condProducer_.wait(locker);}deq_.push_back(item);condConsumer_.notify_one();
}template<class T>
void BlockDeque<T>::push_front(const T &item) {std::unique_lock<std::mutex> locker(mtx_);while(deq_.size() >= capacity_) {condProducer_.wait(locker);}deq_.push_front(item);condConsumer_.notify_one();
}template<class T>
bool BlockDeque<T>::empty() {std::lock_guard<std::mutex> locker(mtx_);return deq_.empty();
}template<class T>
bool BlockDeque<T>::full(){std::lock_guard<std::mutex> locker(mtx_);return deq_.size() >= capacity_;
}template<class T>
bool BlockDeque<T>::pop(T &item) {std::unique_lock<std::mutex> locker(mtx_);while(deq_.empty()){condConsumer_.wait(locker);if(isClose_){return false;}}item = deq_.front();deq_.pop_front();condProducer_.notify_one();return true;
}template<class T>
bool BlockDeque<T>::pop(T &item, int timeout) {std::unique_lock<std::mutex> locker(mtx_);while(deq_.empty()){if(condConsumer_.wait_for(locker, std::chrono::seconds(timeout)) == std::cv_status::timeout){return false;}if(isClose_){return false;}}item = deq_.front();deq_.pop_front();condProducer_.notify_one();return true;
}#endif // BLOCKQUEUE_H

1,原理

利用c++  std::deque 队列,存储数据。

使用两个std::condition_variable 实现生产者和消费者。

使用std::mutex 锁,控制生产者和消费者对队列的控制权。

2, 构造函数

给isClose赋值为false,初始化队列的长度,也可以使用默认值。

3,析构函数

清空队列,设置isClose=false,并唤醒生产者和消费者。

唤醒后,如果此时 消费者或者生产者正在阻塞,则会继续进行,并且检测到了isClose_=false,则会正常退出。再使用信号量 wait 时,析构时要让阻塞去掉,然后函数正常返回。

4,加入元素

 分为从前边加,和从后边加,逻辑时一样的。首先对 队列加锁,然后判断当前队列的长度是否大于设定的容量,如果超出则生产者信号量需要阻塞等待,直到消费者 消费了一个,然后继续向下执行添加逻辑。如果不大于设定的长度,则正常向队列添加一个元素,然后唤醒消费者 信号量,取消费。

5,取出元素

 先给队列加锁保护,然后判断队列是否为空。如果为空,则说明队列没有元素,消费者等待。如果不为空,则正常取出,然后通知生产者继续生产。

这里还有一个函数,用来超时判断,如果队列为空,则等待一定秒数,如果这个时间过后,仍然为空,则直接返回false.

6,其它

clear()  清空队列

empty() 判断队列是否为空

full() 判断是否已满

front() 返回第一个,不会取出

back() 返回最后一个,不会取出

7,测试一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/501126.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024 2.24~3.1 周报

目录 一、本周计划 二、DD-Net整体介绍 三、DDNet的体系结构 四、损失函数 五、课程学习 六、实验环境 A. SEG盐数据集 B. OpenFWI数据集 C. 训练和前沿设置&#xff08;未完&#xff09; 七、结论 八、跑代码——对比试验结果&#xff08;CBAM&#xff09; 1. In…

el-table实现日期表头+二级表头+嵌套echarts

先上效果图 表头的时间首个是搜索项的endTime&#xff0c;后面的时间则是startTime到endTime-1的正序排列&#xff0c;折线图则是时间的正序排列 1、先实现月份表头&#xff0c;用的是项目封装后的el-table&#xff0c;但是跟直接在页面上实现没有啥区别 //数据结构 {"…

css背景图片属性

基础代码&#xff1a; div {width: 200px;height: 200px;background: url(./css-logo.png); }<div></div> 1、background-repeat&#xff1a;默认是repeat 设置背景图片在容器内是否平铺。 background-repeat: repeat-y; background-repeat: repeat-x; background…

MySQL Strict Mode is not set for database connection ‘default‘

在使用 DJango 框架执行迁移文件的命令时&#xff0c;可以看到出现如下警告&#xff1a; (ll_env) D:\workspace\workspace-mengll\learning-log>python manage.py migrate System check identified some issues: WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set …

Linux——进程控制(一)进程的创建与退出

目录 一、进程创建 1.写时拷贝 2.创建多个进程 二、进程终止 1.main函数的返回值 2.bash中的$? 3.自定义退出码 4.C语言的错误码 5.错误码与退出码的区别 6.代码异常终止 7.exit函数 8.总结 一、进程创建 在之前&#xff0c;我们学过linux中的非常重要的函数——…

人工智能_大模型010_Centos7.9中CPU安装ChatGLM3-6B大模型_安装使用_010---人工智能工作笔记0145

从一个空的虚拟机开始安装: https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/files 可以看到这里有很多的数据文件,那么这里 这里点击模型文件就可以下载,这个就是chatglm3-6B的文件,需要点击每个文件,然后点击右边的下载,把文件都下载下来 右侧有下载按钮.点击下载可…

android TextView 实现富文本显示

android TextView 实现富文本显示&#xff0c;实现抖音直播间公屏消息案例 使用&#xff1a; val tvContent: TextView helper.getView(R.id.tvContent)//自己根据UI业务要求&#xff0c;可以控制 图标显示 大小val levelLabel MyImgLabel( bitmap 自己业务上的bitmap )va…

阿里云中小企业扶持权益,助力企业开启智能时代创业新范式

在数字化浪潮的推动下&#xff0c;中小企业正面临着转型升级的重要关口。阿里云深知中小企业的挑战与机遇&#xff0c;特别推出了一系列中小企业扶持权益&#xff0c;旨在帮助企业以更低的成本、更高的效率拥抱云计算&#xff0c;开启智能时代创业的新范式。 一、企业上云权益…

GEE必须会教程—影像数据的区间赋值、插值与比较筛选

影像数据的操作方法比较多&#xff0c;学到今天&#xff0c;至少我们已经学会了如何定义一个影像&#xff0c;以及如何利用Image封装的函数方法进行操作。接下来&#xff0c;我们继续看Image的影像操作方法。 A.定义波段的数据格式 在编程语言中&#xff0c;我们需要根据数据…

新王炸:文生视频Sora模型发布,能否引爆AI芯片热潮

前言 前方高能预警&#xff0c;Sora来袭&#xff01; 浅析Sora的技术亮点 语言模型中构建关键词联系 视频素材分解为时空碎片 扩散模型DiT Not for play, But change world! OpenAI的宏大目标 未来已来&#xff0c;只是尚未流行 Sora的成本与OpenAI的7万亿美金豪赌 算…

【Java设计模式】二、单例模式

文章目录 0、单例模式1、饿汉式2、懒汉式3、双重检查4、静态内部类5、枚举6、单例模式的破坏&#xff1a;序列化和反序列化7、单例模式的破坏&#xff1a;反射8、单例模式的实际应用 设计模式即总结出来的一些最佳实现。GoF(四人组) 书中提到23种设计模式&#xff0c;可分为三大…

阿里云降价!云数据库277元一年,价格下调折扣对照表

2024年阿里云百款产品直降&#xff0c;平均降幅20%&#xff0c;不只是云服务器&#xff0c;也包括云数据库&#xff0c;云数据库涉及产品RDS&#xff08;MySQL、PostgreSQL、MariaDB&#xff09;、Redis社区版、MongoDB、ClickHouse社区兼容版。阿里云百科aliyunbaike.com分享阿…