zoukankan      html  css  js  c++  java
  • 【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);//退出临界区
        }
    }

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

  • 相关阅读:
    通过this调用本类属性和本类方法
    使用构造方法接收引用数据类型
    JAVA回形数
    Bt(宝塔面板)忘记用户名密码的解决方案
    关于xshell远程连接密码呈现灰色无法填写的问题
    ubunt系统创建定时任务
    阿里云服务器如何初始化
    解决laravel 配置路由时除 “/”路由 以外 ,所有路由访问不到的情况
    laravel 5.2 使用 captcha 实现 验证码
    在laravel中如何使用事务
  • 原文地址:https://www.cnblogs.com/huty/p/8517381.html
Copyright © 2011-2022 走看看