環形緩衝buf的建立

2021-06-29 00:27:16 字數 1865 閱讀 5611

用於網路接受到位元組時,放入緩衝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做佇列的話,也需要頻繁分配和釋放結點記憶體。於是自己實現乙個...

緩衝環形佇列

在程式的兩個模組間進行通訊的時候,緩衝區成為乙個經常使用的機制。寫入模組將資訊寫入緩衝區中,讀出模組將資訊讀出緩衝區。這樣使得 緩衝區顯然不適合下面的情況 緩衝區的設計 佇列使用環形佇列,如上圖。環形佇列的特點是,不需要進行動態的記憶體釋放和分配,使用固定大小的記憶體空間反覆使用。在實際的佇列插入和...