“双缓存队列”是我在一次开发任务中针对特殊场景设计出来的结构。使用场景为:发送端持续向接收端发送数据包——并且不理会接收端是否完成业务逻辑。由于接收端在任何情况下停止响应即可能产生数据丢失,因此无法简单的设计一条线程安全队列来对数据写入或读取(读取数据时将队列上锁视为对写入的停止响应)。

鉴于此,我的设计思路如下:

接收端首先向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(), size_b(), trigger(), header_a(), header_a_cur(), header_b(), header_b_cur() {
} 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 = ;
if (size_a == && trigger == ) {
header_a = n;
header_a_cur = n;
size_a++;
} else if (size_b == && trigger == ) {
header_b = n;
header_b_cur = n;
size_b++;
} else {
switch (trigger) {
case :
header_a_cur->next = n;
header_a_cur = n;
size_a++;
break;
case :
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 :
if (header_a != ) {
// change b
trigger = ;
// fetch a
NODE* temp = header_a;
while (temp) {
list.push_back(temp->t);
temp = temp->next;
}
// delete a
temp = header_a;
for (int i = ; i < size_a; ++i) {
NODE* p = temp;
temp = temp->next;
delete p;
}
size_a = ;
header_a = ;
header_a_cur = ;
}
break;
case :
if (header_b != ) {
// change a
trigger = ;
// fetch b
NODE* temp = header_b;
// delete b
while (temp) {
list.push_back(temp->t);
temp = temp->next;
}
temp = header_b;
for (int i = ; i < size_b; ++i) {
NODE* p = temp;
temp = temp->next;
delete p;
}
size_b = ;
header_b = ;
header_b_cur = ;
}
break;
}
return list;
}

注1:开发环境与IDE分别为CentOS 7,NetBeans 8.2

数据结构与算法(c++)——双缓存队列的更多相关文章

  1. 用Python实现的数据结构与算法:双端队列

    一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两 ...

  2. Python实现的数据结构与算法之双端队列详解

    一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两 ...

  3. 22.1.23Manacher算法、双端队列、单调栈

    22.1.23Manacher算法.双端队列.单调栈 1.Manacher算法 1)用途: Manacher算法用于解决类似求某个字符串中最长的回文子串.(回文就是正着读和倒着读一样的结构). 2)算 ...

  4. Java数据结构和算法(五)——队列

    前面一篇博客我们讲解了并不像数组一样完全作为存储数据功能,而是作为构思算法的辅助工具的数据结构——栈,本篇博客我们介绍另外一个这样的工具——队列.栈是后进先出,而队列刚好相反,是先进先出. 1.队列的 ...

  5. 自己动手实现java数据结构(四)双端队列

    1.双端队列介绍 在介绍双端队列之前,我们需要先介绍队列的概念.和栈相对应,在许多算法设计中,需要一种"先进先出(First Input First Output)"的数据结构,因 ...

  6. 算法-deque双端队列

    Python的deque模块,它是collections库的一部分.deque实现了双端队列,意味着你可以从队列的两端加入和删除元素 1.基本介绍 # 实例化一个deque对象d = deque()d ...

  7. 数据结构和算法 – 3.堆栈和队列

    1.栈的实现   后进先出     自己实现栈的代码 using System; using System.Collections.Generic; using System.Linq; using ...

  8. JavaScript 版数据结构与算法(二)队列

    今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...

  9. JS数据结构及算法(二) 队列

    队列是遵循先进先出的一种数据结构,在尾部添加新元素,并从顶部移除元素. 1.普通队列 function Queue() { this.items = []; } Queue.prototype = { ...

随机推荐

  1. requireJS教程

    目录[-] 使用 RequireJS 优化 Web 应用前端 AMD 简介 传统 JavaScript 代码的问题 AMD 的引入 清单 1. AMD 规范 RequireJS 简介 实战 Requi ...

  2. jquery中attr和prop的区别分析

    这篇文章主要介绍了jquery中attr和prop的区别分析的相关资料,需要的朋友可以参考下 在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别 ...

  3. Oracle PL/SQL Developer集成TFS进行团队脚本文件版本管理

    对于传统的使用关系型数据库的大型软件产品,后台数据库的持续开发和维护可能会产生大量的脚本文件,针对这些脚本文件应该怎样比较方便的进行版本管理,以及如何快捷的在团队之间进行权限等协作管理呢?不同的数据库 ...

  4. angular4.0项目build发布后,刷新页面报错404

    angular4.0项目执行npm run build后,进入页面正常显示. 但是当刷新页面时,报错404,页面未找到. 出现这个问题的原因,应该是找不到路由地址导致的,然后找到了下面的解决方案. 找 ...

  5. Nodejs的运行原理-调用篇

    前言 之前做过Nodejs的架构篇, 有很多朋友留言给我,说没看懂里面的例子,这里我会重新梳理一下,再以http server为例,来解析Nodejs从前端到libuv的调用过程. 正文 回忆a. N ...

  6. Redis学习之一VMWare Pro虚拟机安装和Linux系统的安装

    一.引言 设计模式写完了,相当于重新学了一遍,每次学习都会有不同的感受,对设计模式的理解又加深了,理解的更加透彻了.还差一篇关于设计模式的总结的文章了,写完这篇总结性的文章,设计模式的文章就暂时要告一 ...

  7. 【二分图】ZJOI2007小Q的游戏

    660. [ZJOI2007] 小Q的矩阵游戏 ★☆   输入文件:qmatrix.in   输出文件:qmatrix.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] ...

  8. Python Tornado篇

    Tornado既是一个web server,也是web framework.而它作为web server 采用的是asynchronous IO的网络模型,这是一种很高效的模型. Tornado 和现 ...

  9. 由浅入深SCF无服务器云函数实践

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:陈杰,腾讯云架构平台部技术专家 近年来,互联网服务从一开始的物理服务器托管,虚拟机,容器,发展到现在的云函数,逐步无服务器化,如下表所示. ...

  10. islider结合react的简单实用

    我用islider都是结合react来使用,主要运用在移动端,做首页轮播图,或者是手机图片预览,左右滑动 首先需要 npm install islider.js --save 让后在jsx文件头部引入 ...