发布于 2年前

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

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

©2020 edoou.com   京ICP备16001874号-3