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中新建站点并配置端口与物理路径?