環形緩衝區

2021-09-30 18:29:47 字數 1585 閱讀 4624

環形緩衝區

環形緩衝區的定義

訊息佇列的資料結構有很多, 但是使用陣列更加高效

基本結構

緩衝區包含以下的元素:

讀寫的指標

儲存的資料型別

緩衝區是否滿的標誌和多執行緒訪問的鎖

上述展示了直觀的儲存方式, r代表是讀指標, w代表寫指標, 至於資料的讀取如何實現可按照前述**

關於緩衝區是否滿的標誌問題:

r==w的時候, 說明緩衝區佇列空了

r== (w+ 1) %size, 表示緩衝區滿了

存在問題:

如果當指標繞過一圈r==w的時候那麼緩衝區也是空的

緩衝區會存在乙個空間沒有被利用

解決方法:

​ 始終空出乙個空間來區分佇列空和佇列滿的標誌, 所以第乙個問題就不會發生

關於多執行緒訪問的問題:

執行緒鎖的採用:

已知採用最多的執行緒鎖就是mutex, 但是查閱資料後發現mutex是針對整個作業系統的, 所以速度很慢

採用critical_section可以加快速度

兩者的區別是critical_section是針對系統內單一程序內的執行緒處理的, 如果涉及整個系統的那麼mutex, 更加的優選

執行緒鎖的實現

#define atuo_critical_section(lock_cs) cautocriticalsection(lock_cs)//自動

class clock_cs

~clock_cs()

void lock()

void unlock()

};//自動管理呼叫釋放

class cautocriticalsection

~cautocriticalsection()

private:

cautocriticalsection& operator = (const cautocriticalsection& ) = delete;

}

讀寫的實現

讀的思路

atuo_critical_section(lock); //執行緒鎖

/* code: 判斷讀的len長度是否滿足要求

*/if(w > r) //說明只需要用(&w - &r) / size 即可知道整體的長度

else

寫的思路

atuo_critical_section(lock_cs);// 執行緒鎖

/* code:判斷寫入長度是否滿足要求

*/if(w < r)//迴圈一圈,則最大寫入的長度就是(&r-&w)/size

else

環形緩衝區

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 指向下乙個元素。上述的操作並不複雜,不過有乙個小小的麻煩 空環和滿環...