環形緩衝區
環形緩衝區的定義
訊息佇列的資料結構有很多, 但是使用陣列更加高效
基本結構
緩衝區包含以下的元素:
讀寫的指標
儲存的資料型別
緩衝區是否滿的標誌和多執行緒訪問的鎖
上述展示了直觀的儲存方式, 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 指向下乙個元素。上述的操作並不複雜,不過有乙個小小的麻煩 空環和滿環...