1. 程式人生 > >【C/C++開發】C++佇列快取的實現

【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);//退出臨界區
    }
}

​ 以上便是快取佇列的實現過程,需要注意的是,資料處理的速度一定要大於資料獲取或採集的速度,否則快取佇列裡的快取將不斷增大,從而造成記憶體洩露。