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

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

  • 相关阅读:
    QQ恢复解散后的群聊或删除后的好友的方法
    微软双屏手机Surface Duo曝新料
    利用Travis CI+GitHub实现持续集成和自动部署
    利用echarts展示旅行足迹
    03_K近邻算法
    02_感知机算法
    《面试官之你说我听》:简明的图解Redis RDB持久化、AOF持久化
    【绝对有收获】看看?必须告诉你为什么要使用MQ消息中间件(图解版)
    推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)
    利用window.performance.timing进行性能分析
  • 原文地址:https://www.cnblogs.com/huty/p/8517381.html
Copyright © 2020-2023  润新知