【C/C++开发】C++队列缓存的实现
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++队列缓存的实现的更多相关文章
- Python之路,Day10 - 异步IO\数据库\队列\缓存
Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...
- PHP开发中的缓存技术汇总
在PHP开发中,出于对网站服务器负载的考虑,往往需要对页面.数据等内容进行缓存处理,下面就来看看,在PHP开发中有哪些缓存方式吧. 1.页面部分缓存该种方式,是将一个页面中不经常变的部分进行静态缓存, ...
- 大数据高并发系统架构实战方案(LVS负载均衡、Nginx、共享存储、海量数据、队列缓存)
课程简介: 随着互联网的发展,高并发.大数据量的网站要求越来越高.而这些高要求都是基础的技术和细节组合而成的.本课程就从实际案例出发给大家原景重现高并发架构常用技术点及详细演练. 通过该课程的学习,普 ...
- 异步IO/协程/数据库/队列/缓存(转)
原文:Python之路,Day9 - 异步IO\数据库\队列\缓存 作者:金角大王Alex add by zhj: 文章很长 引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这 ...
- .Net Core 跨平台开发实战-服务器缓存:本地缓存、分布式缓存、自定义缓存
.Net Core 跨平台开发实战-服务器缓存:本地缓存.分布式缓存.自定义缓存 1.概述 系统性能优化的第一步就是使用缓存!什么是缓存?缓存是一种效果,就是把数据结果存在某个介质中,下次直接重用.根 ...
- Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能。
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能. 下面是一个效果图 ...
- 第十一章 企业项目开发--消息队列activemq
注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2) 代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC ...
- Python之路第一课Day10--随堂笔记(异步IO\数据库\队列\缓存)
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...
- Java Executor并发框架(三)ThreadPoolExecutor 队列缓存策略
前面两篇讲解了线程池中线程创建后的运行情况,其中有一系列的策略来保证线程正常运行.但是我们知道线程池是可以设置容量的,而且这容量的设置也是至关重要的,如果容量设置的太小,那么将会影响系统的运行效率,如 ...
随机推荐
- effective Java 第三版学习笔记
创建对象类型的 1,静态工厂方法代替构造器 静态工厂方法有名称,不容易混乱他的作用 不必再每次调用他的时候创建实例,创建实例的代价是高的,可以重复利用缓存的对象 静态工厂甚至能返回子类对象,例如在接口 ...
- @select注解中可以用条件构造器
https://mp.baomidou.com/guide/wrapper.html#lambda https://blog.csdn.net/weixin_42236404/article/deta ...
- spark的广播变量
直接上代码:包含了,map,filter,persist,mapPartitions等函数 String master = "spark://192.168.2.279:7077" ...
- mysql更新数据,条件为实时查询出来的数据
--将更新条件保存到临时表里 CREATE TABLE tmp3 AS (SELECT username FROM oa_user WHERE username NOT IN (SELECT user ...
- 验证账号密码是否为空 if格式
当前台页面是否提示有没有输入账号密码时 这时需要验证 //验证账号是否为空 if(string.IsNullOrEmpty(zh)) { //为空 则提示输入账号 ObjToJsin.msg = &q ...
- LOJ P10171 牧场的安排 题解
每日一题 day6 打卡 Analysis 状压dp dp[i][j]+=dp[i-1][k]; #include<iostream> #include<cstdio> #in ...
- 四十六.系统审计 服务安全 Linux安全之打补丁
192.168.4.51 1.部署audit监控文件 使用audit监控/etc/ssh/sshd_config 当该文件发生任何变化即记录日志 通过手动和ausearch工具查看日志内容 1 ...
- 基于评分的商品top-N推荐系统
import io # needed because of weird encoding of u.item file import os from surprise import KNNBaseli ...
- Kalman实际应用总结
目录 Kalman理论介绍 一. 简单理论介绍理论 二. 升华理论介绍 Kalman基本应用 一. Kalman跟踪/滤波 二. Kalman预测/融合(单传感器) 三. Kalman多传感器融合A ...
- Mac下的PHP的配置与运行
mac 下自带apache bogon:Documents macname$ apachectl -version Server version: Apache/ (Unix) Server buil ...