C++数据结构与算法之双缓存队列实现方法详解
发布时间 - 2026-01-11 02:57:52 点击率:次本文实例讲述了C++数据结构与算法之双缓存队列实现方法。分享给大家供大家参考,具体如下:

“双缓存队列”是我在一次开发任务中针对特殊场景设计出来的结构。使用场景为:发送端持续向接收端发送数据包——并且不理会接收端是否完成业务逻辑。由于接收端在任何情况下停止响应即可能产生数据丢失,因此无法简单的设计一条线程安全队列来对数据写入或读取(读取数据时将队列上锁视为对写入的停止响应)。
鉴于此,我的设计思路如下:
接收端首先向A队列中写入数据,然后当数据处理请求到来的时候切换到B队列继续写入,之后将A队列中的数据交给数据处理模块,处理完成以后A队列数据清空。当下一次数据处理请求到来时,再将写入请求切换回A队列,并把B队列中的数据提交给数据处理模块再清空队列B,轮流作业。
有了思路以后,代码就比较简单了。
#include <list>
template<typename T>
class DoubleArray {
struct NODE {
T t;
NODE* next;
};
int size_a;
int size_b;
NODE* header_a;
NODE* header_a_cur;
NODE* header_b;
NODE* header_b_cur;
int trigger;
public:
DoubleArray() : size_a(0), size_b(0), trigger(0), header_a(0), header_a_cur(0), header_b(0), header_b_cur(0) {
}
int push(T t);
std::list<T>& fetch(std::list<T>& list);
};
template<typename T>
int DoubleArray<T>::push(T t) {
NODE *n = new NODE;
n->t = t;
n->next = 0;
if (size_a == 0 && trigger == 0) {
header_a = n;
header_a_cur = n;
size_a++;
} else if (size_b == 0 && trigger == 1) {
header_b = n;
header_b_cur = n;
size_b++;
} else {
switch (trigger) {
case 0:
header_a_cur->next = n;
header_a_cur = n;
size_a++;
break;
case 1:
header_b_cur->next = n;
header_b_cur = n;
size_b++;
break;
}
}
}
template<typename T>
std::list<T>& DoubleArray<T>::fetch(std::list<T>& list) {
switch (trigger) {
case 0:
if (header_a != 0) {
// change b
trigger = 1;
// fetch a
NODE* temp = header_a;
while (temp) {
list.push_back(temp->t);
temp = temp->next;
}
// delete a
temp = header_a;
for (int i = 0; i < size_a; ++i) {
NODE* p = temp;
temp = temp->next;
delete p;
}
size_a = 0;
header_a = 0;
header_a_cur = 0;
}
break;
case 1:
if (header_b != 0) {
// change a
trigger = 0;
// fetch b
NODE* temp = header_b;
// delete b
while (temp) {
list.push_back(temp->t);
temp = temp->next;
}
temp = header_b;
for (int i = 0; i < size_b; ++i) {
NODE* p = temp;
temp = temp->next;
delete p;
}
size_b = 0;
header_b = 0;
header_b_cur = 0;
}
break;
}
return list;
}
注:开发环境与IDE分别为CentOS 7,NetBeans 8.2
希望本文所述对大家C++程序设计有所帮助。
# C++
# 数据结构
# 算法
# 双缓存队列
# C++ 实现LRU 与 LFU 的缓存算法
# c++实现的常见缓存算法和LRU
# C++开发在IOS环境下运行的LRUCache缓存功能
# C++实现LeetCode(146.近最少使用页面置换缓存器)
# C++实现LRU缓存的操作方法
# 数据处理
# 清空
# 我在
# 给大家
# 分别为
# 后将
# 并把
# 所述
# 再将
# 不理会
# 数据包
# 程序设计
# 时将
# 来时
# 切换到
# 一条线
# 数据丢失
# 情况下
# 讲述了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
如何快速查询域名建站关键信息?
IOS倒计时设置UIButton标题title的抖动问题
b2c电商网站制作流程,b2c水平综合的电商平台?
如何获取上海专业网站定制建站电话?
如何快速生成可下载的建站源码工具?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
实现点击下箭头变上箭头来回切换的两种方法【推荐】
南京网站制作费用,南京远驱官方网站?
在Oracle关闭情况下如何修改spfile的参数
JavaScript Ajax实现异步通信
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
怎么用AI帮你为初创公司进行市场定位分析?
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
高端网站建设与定制开发一站式解决方案 中企动力
网站制作企业,网站的banner和导航栏是指什么?
Android Socket接口实现即时通讯实例代码
公司网站制作价格怎么算,公司办个官网需要多少钱?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
如何获取PHP WAP自助建站系统源码?
如何为不同团队 ID 动态生成多个非值班状态按钮
Python面向对象测试方法_mock解析【教程】
jquery插件bootstrapValidator表单验证详解
深圳网站制作的公司有哪些,dido官方网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
JavaScript中的标签模板是什么_它如何扩展字符串功能
Python制作简易注册登录系统
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
如何在阿里云服务器自主搭建网站?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
百度浏览器如何管理插件 百度浏览器插件管理方法
浅谈javascript alert和confirm的美化
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Laravel怎么实现验证码(Captcha)功能
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
无锡营销型网站制作公司,无锡网选车牌流程?
JavaScript如何实现倒计时_时间函数如何精确控制
Laravel如何自定义错误页面(404, 500)?(代码示例)
Android实现代码画虚线边框背景效果
Android okhttputils现在进度显示实例代码
如何在腾讯云服务器快速搭建个人网站?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
如何在IIS中新建站点并配置端口与物理路径?

