int cramfifobuffer::fifo_write(char* pbuf, size_t size)
bool islast = false;
if (!m_iswritefirst)
//這個邏輯是為了判斷讀指標是否已經到了尾段
nodelist::iterator itr = m_nodelist.begin();
nodebuffer item = *itr;
if (item.pnode + item.ilen > ptail)//說明已經讀到了buffer最後
m_nodelist.erase(itr);
if (m_nodelist.size() == 0)
itr = m_nodelist.begin();
item = *itr;
pread = item.pnode;//讀指標移動到下乙個記憶體對映位置
if (islast)
return 1;}}
return 1;
}//讀取記憶體緩衝區資料
int cramfifobuffer::fifo_read(char *dest, int& buf_size)
int len = min(ptail - pread, buf_size);
memcpy(dest, pread, len); //將資料拷貝到dest
pread += len; //將資料拷貝到pwrie
if (pread >= ptail)
m_nodelist.erase(itr);//讀取後刪除記憶體節點
return 1;
}其實原理很簡單,如果感興趣的同學可以看些原始碼
環形緩衝區
include include include include include define buffsize 1024 1024 define min x,y x y x y pthread mutex t lock pthread mutex initializer struct cycle b...
環形緩衝區
define print buf size 16 1024 static char g pcnetprintbuf 環形緩衝區的首位址 static int g ireadpos 0 環形緩衝區讀的位置 static int g iwritepos 0 環形緩衝區寫的位置 intinit 判斷環形緩...
環形緩衝區
環形緩衝區要維護兩個索引,分別對應寫入端 w 和讀取端 r 寫入 push 的時候,先確保環沒滿,然後把資料複製到 w 所對應的元素,最後 w 指向下乙個元素 讀取 pop 的時候,先確保環沒空,然後返回 r 對應的元素,最後 r 指向下乙個元素。上述的操作並不複雜,不過有乙個小小的麻煩 空環和滿環...