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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,009评论 19 139
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,387评论 0 6
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,638评论 25 708
  • 今天是春节过后上班的第一天。我没去上班。我病了。节后综合症。确切的说,这个病是从放假第一天开始得上的。一直有一种愁...
    roronora阅读 274评论 0 0
  • 一、澄清目的和意义 Q01:您认为什么是跃迁式的成长? 阶段性的非线性成长:认知-能力-能级跃迁。 掌握了事物发展...
    ST2021阅读 343评论 0 0