栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++数据结构与算法之双缓存队列实现方法详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++数据结构与算法之双缓存队列实现方法详解

本文实例讲述了C++数据结构与算法之双缓存队列实现方法。分享给大家供大家参考,具体如下:

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

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

接收端首先向A队列中写入数据,然后当数据处理请求到来的时候切换到B队列继续写入,之后将A队列中的数据交给数据处理模块,处理完成以后A队列数据清空。当下一次数据处理请求到来时,再将写入请求切换回A队列,并把B队列中的数据提交给数据处理模块再清空队列B,轮流作业。

有了思路以后,代码就比较简单了。

#include 
template
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& fetch(std::list& list);
};
template
int DoubleArray::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
std::list& DoubleArray::fetch(std::list& 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++程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/63308.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号