【C/C++開發】C++佇列快取的實現
阿新 • • 發佈:2019-02-15
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);//退出臨界區
}
}
以上便是快取佇列的實現過程,需要注意的是,資料處理的速度一定要大於資料獲取或採集的速度,否則快取佇列裡的快取將不斷增大,從而造成記憶體洩露。