環形緩衝區

2021-09-26 05:01:34 字數 515 閱讀 3239

環形緩衝區要維護兩個索引,分別對應寫入端(w)和讀取端(r)。寫入(push)的時候,先確保環沒滿,然後把資料複製到 w 所對應的元素,最後 w 指向下乙個元素;讀取(pop)的時候,先確保環沒空,然後返回 r 對應的元素,最後 r 指向下乙個元素。

上述的操作並不複雜,不過有乙個小小的麻煩:空環和滿環的時候,r 和 w 都指向同乙個位置!這樣就無法判斷到底是「空」還是「滿」。大體上有兩種方法可以解決該問題。

辦法1:始終保持乙個元素不用

當空環的時候,r 和 w 重疊。當 w 比 r 跑得快,追到距離 r 還有乙個元素間隔的時候,就認為環已經滿。當環內元素占用的儲存空間較大的時候,這種辦法顯得很土(浪費空間)。

辦法2:維護額外變數

由於環形緩衝區本身就是要降低儲存空間分配的開銷,因此緩衝區中元素的型別要選好。盡量儲存【值型別】的資料,而不要儲存【指標(引用)型別】的資料。因為指標型別的資料又會引起儲存空間(比如堆記憶體)的分配和釋放,使得環形緩衝區的效果大打折扣。

環形緩衝區

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 判斷環形緩...

環形緩衝區

環形緩衝區 環形緩衝區的定義 訊息佇列的資料結構有很多,但是使用陣列更加高效 基本結構 緩衝區包含以下的元素 讀寫的指標 儲存的資料型別 緩衝區是否滿的標誌和多執行緒訪問的鎖 上述展示了直觀的儲存方式,r代表是讀指標,w代表寫指標,至於資料的讀取如何實現可按照前述 關於緩衝區是否滿的標誌問題 當r ...