C++ 队列大小限制的最佳实践
创作时间:
作者:
@小白创作中心
C++ 队列大小限制的最佳实践
引用
1
来源
1.
https://code-examples.net/cn/q/4b16d8d
在C++编程中,队列是一种常用的数据结构,遵循先入先出(FIFO)的原则。然而,标准的
std::queue并没有直接限制大小的功能。本文将介绍两种限制队列大小的方法:自定义队列类和生产者-消费者模型,并提供详细的代码示例。
C++ 中限制 Queue 大小
理解 Queue
在 C++ 中,Queue<T> 是一个常用的容器适配器,它遵循先入先出(FIFO)的原则。这意味着,先插入的元素将先被取出。
限制 Queue 大小
标准的 Queue<T> 并没有直接限制大小的功能。然而,我们可以通过一些方法来实现:
方法 1:自定义队列类
- 继承 std::deque:
- 创建一个自定义的队列类,继承自
std::deque。 - 添加一个成员变量
max_size来存储最大容量。 - 在
push操作中,检查队列是否已满,如果满了,则删除队首元素。
#include <deque>
template <typename T>
class LimitedQueue {
public:
LimitedQueue(int maxSize) : max_size_(maxSize) {}
void push(const T& value) {
if (size() == max_size_) {
pop();
}
queue_.push_back(value);
}
// 其他操作(pop, front, back, empty, size)与 std::queue 相似
private:
std::deque<T> queue_;
int max_size_;
};
方法 2:使用条件变量和互斥量
- 创建生产者-消费者模型:
- 使用条件变量和互斥量来控制队列的入队和出队操作。
- 生产者线程在入队时,如果队列已满,则等待条件变量。
- 消费者线程在出队时,如果队列为空,则等待条件变量。
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
std::queue<int> queue;
std::mutex mtx;
std::condition_variable cv;
int max_size = 10;
void producer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return queue.size() < max_size; });
queue.push(rand());
cv.notify_one();
}
}
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !queue.empty(); });
int value = queue.front();
queue.pop();
cv.notify_one();
// 处理 value
}
}
- 方法 2 适用于更复杂的场景,需要精确控制队列的大小和线程之间的同步。
- 方法 1 适用于简单的限制大小需求,不需要复杂的线程同步。
解析示例代码
示例 1:自定义队列类
#include <deque>
template <typename T>
class LimitedQueue {
public:
LimitedQueue(int maxSize) : max_size_(maxSize) {}
void push(const T& value) {
if (size() == max_size_) {
pop();
}
queue_.push_back(value);
}
// 其他操作(pop, front, back, empty, size)与 std::queue 相似
private:
std::deque<T> queue_;
int max_size_;
};
解释
继承 std::deque
基于std::deque实现自定义队列,利用其高效的插入和删除操作。限制大小 max_size_
定义一个成员变量max_size_来存储最大容量。push 操作
- 检查容量
如果队列已满,先移除队首元素。 - 插入元素
使用queue_.push_back将元素插入队尾。
示例 2:生产者-消费者模型
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
std::queue<int> queue;
std::mutex mtx;
std::condition_variable cv;
int max_size = 10;
void producer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return queue.size() < max_size; }); // 等待队列不满
queue.push(rand());
cv.notify_one(); // 通知消费者
}
}
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !queue.empty(); }); // 等待队列非空
int value = queue.front();
queue.pop();
cv.notify_one(); // 通知生产者
// 处理 value
}
}
共享资源 queue
定义一个共享的std::queue作为缓冲区。互斥量 mtx
保护对共享资源的访问,确保线程安全。条件变量 cv
用于线程间的同步,实现等待和唤醒机制。生产者线程 producer
- 等待队列不满
使用cv.wait等待条件变量,直到队列大小小于max_size。 - 入队
插入随机数到队列。 - 通知消费者
使用cv.notify_one唤醒消费者线程。
- 消费者线程 consumer
- 等待队列非空
使用cv.wait等待条件变量,直到队列不为空。 - 出队
取出队首元素。 - 通知生产者
使用cv.notify_one唤醒生产者线程。
其他限制 Queue 大小的方法
除了前面介绍的自定义队列类和生产者-消费者模型,还有其他一些方法可以用来限制 Queue<T> 的大小:
使用 std::deque 的 pop_front()
- 简单直接
这种方法相对简单,但需要注意在队列为空时调用pop_front()可能会导致异常。 - 直接移除元素
在push_back()之前,先判断队列是否已满。如果满了,直接移除队首元素。
使用 std::condition_variable 和 std::mutex
- 复杂度较高
实现相对复杂,需要考虑线程同步和条件变量的使用。 - 精细控制
可以更细粒度地控制队列的入队和出队操作。
使用 std::async 和 std::future
- 复杂度较高
涉及异步编程的知识,需要谨慎使用。 - 异步操作
可以异步地执行入队和出队操作,提高并发性能。
选择合适的方法
- 复杂需求
生产者-消费者模型或异步编程方法可以提供更灵活和高效的解决方案。 - 简单需求
自定义队列类或直接使用std::deque的pop_front()方法可能就足够了。
注意事项
- 性能优化
根据具体应用场景,选择合适的算法和数据结构来优化性能。 - 异常处理
考虑可能出现的异常,如队列为空或已满的情况。 - 线程安全
对于多线程环境,一定要确保线程安全。使用互斥量和条件变量可以有效地同步线程。
热门推荐
等温过程和理想气体定律的应用
心理学人格类型分为哪几种 16型人格最优秀的4人格
如何不内耗自己调整情绪
吃辣椒真的能减肥吗?对眼睛有好处吗?
辣椒和黄瓜可以一起吃吗
如何让肚脐保持干燥状态
宝宝晚上咳嗽的厉害怎么办
宝宝睡觉时采取什么姿势能缓解咳嗽的症状
盘点6部经过了时间考验的经典动漫:数码宝贝让人爱,火影值得看
为什么0和1的思维是计算机及其自动化的基本思维之一
勾股定理在现代几何学中的应用解析
射频溶脂瘦腰:哪些人适合?哪些人不适合?
如何选择最适合您的游戏分辨率?
跨越两千年,黄金还保值吗?
如何分辨金融市场的市场情绪?这对投资决策有何作用?
肺癌晚期一般能活几年?这些因素影响生存期
金融观察:中国扩内需 尚有很大空间
零基础英语学习顺序:从音标到词汇的系统化路径
打破国外垄断,利好帕金森患者:国产经颅“磁波刀”系统临床前实验在沪完成
打破国外垄断,利好帕金森患者:国产经颅“磁波刀”系统临床前实验在沪完成
起床头晕感觉天旋地转是什么原因
丰田Celica XX:传奇Supra的起点,经典跑车的诞生之路
传奇跑车再现经典:雪佛兰Corvette Stingray
东北三省2024年财政收入对比:辽宁近3000亿,吉林省暴涨,黑龙江呢
“馕言文”火了,网友:哎捧友,你的头里知识塔里木河一样流呢
《哪吒2》香港票房碾压港片,香港观众破防打0.5分:看的中途想走
美国公司付款预扣税处理全攻略:深入解析与实务指导
数学建模:人口增长问题(基于指数增长模型和阻滞增长模型)
Git Issue管理规范指南
《最美好的爱情》:一首动人的音乐诗篇