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 (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);//退出临界区
}
}

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

版权声明:著作权归作者所有。

相关推荐

Python多线程编程 - 用队列实现生产者消费者模式

生产者和消费者模式的实现有很多中方式。这里的示例基于队列来实现生产者和消费者模式。生产者和消费者在各自的线程中运行,并检查队列的状态。如果队列没有满,生产者线程负责往队列里放数据。消费者线程负责从队列里取数据,前提是队列不是空的。代码示例:import threadingimport timeimport loggingimport randomimport Queuelogging.basicC

C++使用libcurl调用https接口做ssl证书验证

libcurl调用https路径,做SSL的验证有3个参数:CURLOPT_SSL_VERIFYPEER,CURLOPT_SSL_VERIFYHOST,CURLOPT_CAINFO。设置示例:CURL *hCurl = curl_easy_init();curl_easy_setopt(hCurl, CURLOPT_SSL_VERIFYPEER, 1L);curl_easy_setopt(hCur

C#对List的元素按属性排序

C#对List元素排序有几种方法。方法一、使用LinqList<User> sortedList = list.OrderBy(o=>o.ID).ToList();如果按降序排序,可以使用OrderByDescending方法:List<User> sortedList = list.OrderByDescending(o=>o.ID).ToList();方法二

C++17 获取文件字节大小的方法

C++ 17可以使用filesystem来获取文件路径的字节大小:#include <cstdint>#include <filesystem>// ...std::uintmax_t size = std::filesystem::file_size("c:\\foo\\bar.txt");需要注意的是,除非是独自占有地打开文件来读,否在文件的字节大小会随着读的过程而变化

C#计算用户年龄

此方法仅用于简单计算年龄,不适用于计算虚岁public static int GetAge(DateTime birthDate) {     DateTime now = DateTime.Now;      int age&n

页面调试禁用Chrome浏览器的缓存

在前端开发过程中,页面调试时常常需要清理浏览器的缓存,下面介绍两种禁用Chrome缓存的方法。方法一:1、F12打开开发这工具2、选中开发者工具的Network标签3、把Disable cache勾选上,如图注意:禁用Chrome的缓存只有在开发者工具打开时才起作用。方法二安装清理缓存的Chrome插件。可以试一下Cache Killer。