C++队列缓存的实现

为什么使用队列缓存

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

引用queue队列

在头文件中引用queue队列

#include <queue>
using namespace std;

定义缓存结构体

struct DataInfo
{
char* pBuf;//缓存内容
int iSize;//缓存大小 DataInfo()
{
pBuf = NULL;
iSize = 0;
}
};

实例化queue队列

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

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

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

CRITICAL_SECTION m_lock;
InitializeCriticalSection(&m_lock);//初始化

缓存数据

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

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

数据处理

创建数据处理线程

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

开始处理数据

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

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

【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. 几个牛X的js开发技巧

    1. 确保数组值 使用 grid ,需要重新创建原始数据,并且每行的列长度可能不匹配, 为了确保不匹配行之间的长度相等,可以使用Array.fill方法. let array = Array(5).f ...

  2. 【解题报告】CSP2019-S D1T1 格雷码

    题目链接:https://www.luogu.org/problem/P5657 话说这道题怎么是道橙题啊. 基本思路 因为n位格雷码的前2n-1位就是n-1位格雷码前面加了一位‘0’,所以可以把它们 ...

  3. Appium自动化测试教程-自学网-monkey日志管理

    日志管理作用 Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和 ...

  4. 012——C#打开ecxel修改数据(附教程)

    (一)参考文献:[C#]将数据写入已存在的excel文件 C# 导入excel数据,解决关闭excel后不能释放资源的问题 (二)视频教程:https://v.qq.com/x/page/p30063 ...

  5. 使用VS创建三层架构的项目

    使用VS创建三层架构的项目 1.打开VS软件: 2.创建新项目: 3.创建新项目打开后选择SAP的选项点击创建{注:上面还有一个和这个相似的项目创建:看清楚在选择: 4.创建后改下名字,框架如果不是3 ...

  6. 前端利用webuploader实现超大文件分片上传、断点续传

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  7. KindEditor3.x-自动上传Word图片功能.

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...

  8. 代码 | 自适应大邻域搜索系列之(7) - 局部搜索LocalSearch的代码解析

    前言 好了小伙伴们我们又见面了,咳咳没错还是我.不知道你萌接连被这么多篇代码文章刷屏是什么感受,不过,酸爽归酸爽.今天咱们依然讲代码哈~不过今天讲的依然很简单,关于局部搜索LocalSearch的代码 ...

  9. (5)打鸡儿教你Vue.js

    条件与循环 条件判断使用 v-if 指令 <p v-if="seen"> <template v-if="ok"> <script ...

  10. Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1)

    Virtual participate 的,D题不会做,打了1:30就打不动了,过了ABCE. A - CME 题意:? 题解:? void test_case() { int n; scanf(&q ...