C++队列缓存的实现

为什么使用队列缓存

c++的队列缓存主要用于解决大数据量并发时的数据存储问题,可以将并发时的数据缓存到队列中,当数据量变小时再匀速写入硬盘中。

引用queue队列

在头文件中引用queue队列

  1. #include <queue>
  2. using namespace std;

定义缓存结构体

  1. struct DataInfo
  2. {
  3. char* pBuf;//缓存内容
  4. int iSize;//缓存大小
  5. DataInfo()
  6. {
  7. pBuf = NULL;
  8. iSize = 0;
  9. }
  10. };

实例化queue队列

在头文件中实例化缓存队列

  1. queue<DataInfo> m_dq_buf; // 缓存队列

创建管理缓存队列的临界区

  1. CRITICAL_SECTION m_lock;
  2. InitializeCriticalSection(&m_lock);//初始化

缓存数据

在数据回调函数或采集线程中进行数据缓存

  1. void CallBack(int iType, char *pData, int len, void* pClass )
  2. {
  3. CMyClass * pThis = (CMyClass*)pClass;
  4. DataInfo dataInfo;//实例化缓存结构体
  5. char* pBuf = new char[1024*1024*2];//分配2M的缓存空间
  6. //缓存推送到队列
  7. memcpy(pBuf, pdata, len);//数据拷贝到缓存中
  8. dataInfo.pBuf = pBuf;
  9. dataInfo.iSize = pThis->_length;
  10. //使用临界区加锁
  11. EnterCriticalSection(&pThis->m_lock);//进入临界区
  12. pThis->m_dq_buf.push(dataInfo);//数据缓存推送到队列里
  13. LeaveCriticalSection(&pThis->m_lock);//退出临界区
  14. }

数据处理

创建数据处理线程

  1. HANDLE m_hThread = CreateThread(NULL, 0, thread_work, this, 0, NULL);

开始处理数据

  1. DWORD WINAPI thread_work(LPVOID lpParmeter)
  2. {
  3. CMyClass * pThis = (CMyClass*)lpParmeter;
  4. DataInfo dataInfo;//实例化缓存结构体
  5. //当缓存队列中的数据大于0时,不断将数据取出进行处理
  6. while(pThis->m_dq_buf.size()>0)
  7. {
  8. dataInfo = pThis->m_dq_buf.front();
  9. CheckData(dataInfo);//数据处理函数对数据进行处理或存储
  10. delete dataInfo.pBuf;//数据处理完成释放内存
  11. //使用临界区加锁
  12. EnterCriticalSection(&pThis->m_lock);//进入临界区
  13. pThis->m_dq_buf.pop();//将缓存从队列中删除
  14. LeaveCriticalSection(&pThis->m_lock);//退出临界区
  15. }
  16. }

​ 以上便是缓存队列的实现过程,需要注意的是,数据处理的速度一定要大于数据获取或采集的速度,否则缓存队列里的缓存将不断增大,从而造成内存泄露。

【C/C++开发】C++队列缓存的实现的更多相关文章

  1. Python之路,Day10 - 异步IO\数据库\队列\缓存

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  2. PHP开发中的缓存技术汇总

    在PHP开发中,出于对网站服务器负载的考虑,往往需要对页面.数据等内容进行缓存处理,下面就来看看,在PHP开发中有哪些缓存方式吧. 1.页面部分缓存该种方式,是将一个页面中不经常变的部分进行静态缓存, ...

  3. 大数据高并发系统架构实战方案(LVS负载均衡、Nginx、共享存储、海量数据、队列缓存)

    课程简介: 随着互联网的发展,高并发.大数据量的网站要求越来越高.而这些高要求都是基础的技术和细节组合而成的.本课程就从实际案例出发给大家原景重现高并发架构常用技术点及详细演练. 通过该课程的学习,普 ...

  4. 异步IO/协程/数据库/队列/缓存(转)

    原文:Python之路,Day9 - 异步IO\数据库\队列\缓存 作者:金角大王Alex add by zhj: 文章很长 引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这 ...

  5. .Net Core 跨平台开发实战-服务器缓存:本地缓存、分布式缓存、自定义缓存

    .Net Core 跨平台开发实战-服务器缓存:本地缓存.分布式缓存.自定义缓存 1.概述 系统性能优化的第一步就是使用缓存!什么是缓存?缓存是一种效果,就是把数据结果存在某个介质中,下次直接重用.根 ...

  6. Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能. 下面是一个效果图 ...

  7. 第十一章 企业项目开发--消息队列activemq

    注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2) 代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC ...

  8. Python之路第一课Day10--随堂笔记(异步IO\数据库\队列\缓存)

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  9. Java Executor并发框架(三)ThreadPoolExecutor 队列缓存策略

    前面两篇讲解了线程池中线程创建后的运行情况,其中有一系列的策略来保证线程正常运行.但是我们知道线程池是可以设置容量的,而且这容量的设置也是至关重要的,如果容量设置的太小,那么将会影响系统的运行效率,如 ...

随机推荐

  1. Postgresql 日志相关

    目录日志种类作用总结配置文件中与日志相关的配置日志种类 PostgreSQL有3种日志 pg_log(数据库运行日志)   内容可读    默认关闭的,需要设置参数启动pg_xlog(WAL 日志,即 ...

  2. List<Map<String, Obejct>>遍历

    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map&l ...

  3. 前端代码规范-Javascript

    命名规范 ECMAScript 规范中标识符采用驼峰大小写格式,驼峰命名法由小(大)写字母开始,后续每个单词首字母都大写.根据首字母是否大写,分为两种方式: Pascal Case 大驼峰式命名法:首 ...

  4. $.extend和$.fn.extend详解

    一.定义 $.extend()属于j全局的Query对象,用于将一个或多个对象合并到目标对象上: $.fn.extend()属于jQuery的原型对象,用于在jQuery原型上扩展实例属性和方法. 二 ...

  5. linux red hat下安装tomcat的过程

    linux下安装tomcat <-----------1.0----------------->:首先需要先去tomcat官网下载linux版本的tomcat的安装包;  我在官网上下载的 ...

  6. 【2018.07.30】(广度优先搜索算法/队列)学习BFS算法小记

    一些BFS参考的博客: https://blog.csdn.net/ldx19980108/article/details/78641127 https://blog.csdn.net/u011437 ...

  7. Qt的插件开发

    写代码都是从不会到会,那么写博客也是同样的道理.从不会到会最实用的办法就是模仿了.关于Qt的知识很多都是学习了CSDN的一位大神 一去二三里.关于Qt插件的开发,我们也从他的文章里面抽丝剥茧,把最本质 ...

  8. C语言结构体笔记

    typedef给结构起别名 可以是匿名结构或者普通的结构,方便后面使用. #include<stdio.h> typedef struct{ //匿名结构 float tank_capac ...

  9. RK3288 添加普通串口uart1和uart3

    CPU:RK3288 系统:Android 5.1 diff --git a/device/rockchip/common/init.connectivity.rc b/device/rockchip ...

  10. 转: mysql的取整函数

    一.ROUND()函数用法 ROUND(X) -- 表示将值 X 四舍五入为整数,无小数位    ROUND(X,D) -- 表示将值 X 四舍五入为小数点后 D 位的数值,D为小数点后小数位数.若要 ...