moduo之阻塞队列BlockingQueue和BoundedBlockingQueue

server/2024/11/18 9:45:26/

简介

moduo中的队列与java线程池中的队列类似, 有无界阻塞队列和有界阻塞队列

结构

BlockingQueue<T>
- mutable MutexLock mutex_
- Condition notEmpty_
- deque<T> queue_
+BlockingQueue()
+void put(const T& x)
+void put(T&& x)
+T take()
+deque~T~ drain()
+size_t size()
BoundedBlockingQueue<T>
- mutable MutexLock mutex_
- Condition notEmpty_
- Condition notFull_
- boost::circular_buffer<T> queue_
+BoundedBlockingQueue(int maxSize)
+void put(const T& x)
+void put(T&& x)
+T take()
+bool empty()
+bool full()
+size_t size()
+size_t capacity()

BlockingQueue

无界阻塞队列

构造函数

初始化互斥量,条件变量,以及队列

 BlockingQueue(): mutex_(),notEmpty_(mutex_),queue_(){}

添加元素

添加元素方法有两下, 一个传常左值引用 ,一个右值引用
添加后,会唤醒等待线程

void put(const T& x)
{MutexLockGuard lock(mutex_);queue_.push_back(x);notEmpty_.notify(); // wait morphing saves us
}void put(T&& x)
{MutexLockGuard lock(mutex_);queue_.push_back(std::move(x));notEmpty_.notify();
}

取元素

当队列为空时,会条件等待直到队列不为空

T take()
{MutexLockGuard lock(mutex_);// always use a while-loop, due to spurious wakeupwhile (queue_.empty()){notEmpty_.wait();}assert(!queue_.empty());T front(std::move(queue_.front()));queue_.pop_front();return front;
}

清空队列

将队列移动到临时队列中并返回

queue_type drain()
{std::deque<T> queue;{MutexLockGuard lock(mutex_);queue = std::move(queue_);assert(queue_.empty());}return queue;
}

BoundedBlockingQueue

有界阻塞队列差别是添加了notFull_条件变量,同时队列使用boost的环形队列
添加元素时,会先等待队列不为满
取元素时,会唤醒notFull_条件变量


http://www.ppmy.cn/server/142876.html

相关文章

虚幻引擎 CEO 谈元宇宙:发展、策略与布局

在当今科技领域&#xff0c;元宇宙无疑是最热门的话题之一。Epic Games 首席执行官 Tim Sweeney 对元宇宙的未来发展充满信心&#xff0c;他认为开放元宇宙将融合娱乐、游戏和科技产业&#xff0c;带来一个光明的未来。本文将深入探讨采访中的关键内容&#xff0c;分析元宇宙的…

rhce.6

一、DNS域名解析服务器 DNS &#xff08; Domain Name System &#xff09;是互联网上的一项服务&#xff0c;它作为将域名和 IP 地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网。DNS 系统使用的是网络的查询&#xff0c;那么自然需要有监听的 port 。…

谷粒商城のRedisESRabbit MQ集群

文章目录 前言一、搭建Redis集群三、搭建ES集群三、搭建Rabbit MQ集群 前言 本篇是谷粒商城集群部署篇&#xff0c;搭建Redis、ES、Rabbit MQ集群实践的个人笔记&#xff0c;也是谷粒商城笔记的最后一篇。集群相关的理论性内容&#xff0c;会放在面试篇的笔记中。 一、搭建Redi…

AXI DMA IP BUG踩坑记录

1. 问题描述 在突发的过程中总是一旦使用XAxiDma_SimpleTransfer函数就会出现AXI STREAM信号的READY信号先拉高4个数据(32位)的时钟后会迅速拉低,换句话说就是一旦PS端发起了XAxiDma_SimpleTransfer,AXI总线的READY信号就会拉高四个节拍,这样就会导致传输的数据出现问题。…

MySQL如何解决幻读?

目录 一、什么是幻读&#xff1f; 1.1 幻读的定义 1.2 幻读的示例 1.3 幻读产生的原因&#xff1f; 1.4 读已提交&#xff08;Read Committed&#xff09; 1.4.1 确定事务等级 1.4.2 非锁定读取 准备 示例 结论 1.4.3 锁定读取 准备 示例 分析 结论 1.5 可重复读…

微知-Linux存在多个内核如何设置系统默认启动内核?

查看 grubby --default-kernel 可以查看当前默认的启动内核路径。 grubby --infoALL 列出所有已安装的内核及其信息。 设置 grubby --set-default-kernel/boot/vmlinuz-5.9.1-1.el8.elrepo.x86_64 设置默认启动内核 grubby --set-default-index3 通过索引号来设置默认内核&a…

JavaScript 中的多重继承与 ES6 中的继承

JavaScript 中的多重继承与 ES6 中的继承 引言&#xff1a; 在 JavaScript 的奇妙世界中&#xff0c;继承如同一条坚韧的线索&#xff0c;将代码的各个部分紧密相连&#xff0c;构建出复杂而有序的程序结构。今天&#xff0c;我们将深入探索 JavaScript 中的多重继承以及 ES6…

GOOGLE EARTH ENGINE——利用GEE计算和下载雪的覆盖频率(SCF)和雪的消失日期(SDD)含全球除格陵兰岛外的矢量

目录 简介 数据介绍 MODIS/006/MOD10A1 代码解释 代码 结果 简介 利用GEE计算和下载雪的覆盖频率(SCF)和雪的消失日期(SDD) 数据介绍 MODIS/006/MOD10A1 MODIS/006/MOD10A1数据是由美国国家航空航天局(NASA)的Moderate Resolution Imaging Spectroradiometer(…