用於網路接受到位元組時,放入緩衝buf,然後取出解析。使用時需要上鎖
typedef struct tagringbuf
tringbuf;
//建立環形buf
handle ringbufcreate(u32 dwbufsize)
memset(ptringbuf, 0, sizeof(tringbuf));
ptringbuf->m_dwbufsize = dwbufsize;
//建立buf
ptringbuf->m_pbybuf = (u8*)malloc( dwbufsize);
if(!ptringbuf->m_pbybuf)
memset(ptringbuf->m_pbybuf, 0, dwbufsize);
//初始化頭尾
ptringbuf->m_dwtail = 0;
ptringbuf->m_dwhead = dwbufsize-1;
return (handle)ptringbuf;//刪除環形buf
void ringbufdelete(handle hringbuf)
else
//獲取buf空閒大小
u32 ringbuffreesizeget(handle hringbuf)
dwfreesize = ptringbuf->m_dwbufsize+ptringbuf->m_dwhead-ptringbuf->m_dwtail-1;
dwrealputlen = (dwdatalen < dwfreesize ? dwdatalen : dwfreesize);
//分2段拷貝
dwsect1len = ptringbuf->m_dwbufsize-ptringbuf->m_dwtail;
if(dwsect1len > dwrealputlen)
dwsect2len = dwrealputlen-dwsect1len;
memcpy(ptringbuf->m_pbybuf+ptringbuf->m_dwtail, pdata, dwsect1len);
ptringbuf->m_dwtail = ((ptringbuf->m_dwtail+dwsect1len)%ptringbuf->m_dwbufsize);
pdata += dwsect1len;
if(!dwsect2len)
return dwrealputlen;
memcpy(ptringbuf->m_pbybuf+ptringbuf->m_dwtail, pdata, dwsect2len);
ptringbuf->m_dwtail = ((ptringbuf->m_dwtail+dwsect2len)%ptringbuf->m_dwbufsize);
return dwrealputlen;//取資料,dwreadlen欲讀取長度,返回實際讀取大小
u32 ringbufdataget(handle hringbuf, u8 *pbuf, u32 dwreadlen)
//分2段拷貝
dwsect1len = ptringbuf->m_dwbufsize-ptringbuf->m_dwhead-1;
if(dwsect1len > dwrealgetlen)
dwsect2len = dwrealgetlen-dwsect1len;
if(dwsect1len)
if(!dwsect2len)
return dwrealgetlen;
memcpy(pbuf, ptringbuf->m_pbybuf, dwsect2len);
ptringbuf->m_dwhead = (dwsect2len-1);
return dwrealgetlen;
環形緩衝區的建立
建立例項 建立環形快取區 define rbuff set len 8 快取最大長度設定 typedef struct ringbuf st ringbuf st ringbuf 建立乙個ringbuf的緩衝區 void ringbuff init ringbuf st ringbuf me 初始化...
環形緩衝區 環形緩衝佇列學習
專案中需要執行緒之間共享乙個緩衝fifo佇列,乙個執行緒往佇列中添資料,另乙個執行緒取資料 經典的生產者 消費者問題 開始考慮用stl的vector容器,但不需要隨機訪問,頻繁的刪除最前的元素引起記憶體移動,降低了效率。使用linklist做佇列的話,也需要頻繁分配和釋放結點記憶體。於是自己實現乙個...
緩衝環形佇列
在程式的兩個模組間進行通訊的時候,緩衝區成為乙個經常使用的機制。寫入模組將資訊寫入緩衝區中,讀出模組將資訊讀出緩衝區。這樣使得 緩衝區顯然不適合下面的情況 緩衝區的設計 佇列使用環形佇列,如上圖。環形佇列的特點是,不需要進行動態的記憶體釋放和分配,使用固定大小的記憶體空間反覆使用。在實際的佇列插入和...