一:概述
實際學習和工作中,我們經常會遇到讀寫大量資料的情況,這個時候我們可能就用到了迴圈緩衝區。
迴圈緩衝區在處理大量資料的時候有很大的優點,迴圈緩衝區在一些競爭問題上提供了一種免鎖的機制,免鎖的前提是,生產者和消費都只有乙個的情況下,否則也要加鎖。
二:迴圈緩衝區的實現理論如下圖
三:實現**如下所示:
//下面是簡單的測試**:crecyclequeue.h
#include
//迴圈緩衝區類模板
template
class
crecyclequeue
//初始化迴圈緩衝區
bool initrecyclequeue(int
exp)
_read = 0
; _write = 0
;
//傳進來乙個整數,對1進行位移操作
//比如exp = 4
//_size的二進位制表示:1000
_size = 1
<
//_mask的二進位制表示:0111
_mask = _size - 1
;
//分配緩衝區空間
_queue = (t **)new
char[sizeof (t *) *_size];
if(null ==_queue)
return
true
;
}/** size = 1000 mask = 0111
* write或read同mask 作&運算,可以實現迴圈緩衝區的功能
* 也許你會問這裡為什麼不使用 % 運算實現迴圈的迴圈功能呢?
* 答案是系統 & 運算效率要比 % 運算效率高
* * push:
* write = 0;
* 0000 & 0111 = 0; write++ (寫入緩衝佇列的第0位置)
* write = 1;
* 0001 & 0111 = 1; write++ (寫入緩衝佇列的第1位置)
* write = 2;
* 0010 & 0111 = 2; write++
* write = 3;
* 0011 & 0111 = 3; write++
* ...
* write = 8;
* 1000 & 0111 = 0; write++
* write = 9;
* 1001 & 0111 = 1; write++
* ...
* * pop:
* read = 0;
* 0000 & 0111 = 0; read++ (讀取緩衝佇列的第0位置的資料)
* read = 1;
* 0001 & 0111 = 1; read++ (讀取緩衝佇列的第1位置的資料)
* read = 2;
* 0010 & 0111 = 2; read++
* read = 3
* 0011 & 0111 = 3; read++
* ...
* read = 8;
* 1000 & 0111 = 0; read++
* ...
* */
bool push(t *type)
//當條件不滿足的時候,說明緩衝區已滿,push進來的資料就會丟失
if(_write < _read +_size)
return
false
; }
t *pop()
return
tmp;
}intgetremainsize()
};
//編譯:g++ main.cpp -lpthread -o testmain.cpp
#include
#include
#include
"crecyclequeue.h
"using
namespace
std;
class
userinfo
intgetusernum()
};crecyclequeue
*queue = new crecyclequeue;
void *write_func(void *args)
sleep(1);
}}void *read_func(void *args)
sleep(1);
}}int
main()
這個迴圈緩衝佇列大體的功能已經實現,其中迴圈緩衝佇列一些其他操作並沒有去實現,只是描述了一些核心的操作!
如果有錯誤和其他意見,提出來大家一起相互討論和學習!
迴圈緩衝區類
乙個迴圈緩衝區的實現類。思路 分配乙個固定緩衝區,利用緩衝區讀寫資料。當寫到緩衝區底部而讀指標不在緩衝區頂部時,則寫指標移動到緩衝區頂部,繼續寫操作。insream.h include pragma once class insream 迴圈堆疊 byte getreadcursor byte ge...
迴圈緩衝區
這次需要記錄之前了解到的參考自linux核心迴圈佇列kfifo的迴圈緩衝區實現方法。1 迴圈緩衝區的實現依靠佇列來實現,也就是分配乙個陣列來儲存實際資料。2 對於乙個迴圈緩衝區來說,我們需要關注的點有 緩衝區大小應該設定多少?緩衝區隊頭 in 隊尾 out 初始值?緩衝區什麼時候為空,什麼時候為滿?...
opengl模板緩衝區
相信大家有些人對opengl的模板緩衝區不是很理解,包括我最開始也是,opengl的模板緩衝區其實就是採用過濾的技術來控制那些顏色可以繪製,那些不能進行繪製。這裡的過濾技術也就是我們的乙個控制方法,主要體現在如下兩個函式glstencilfunc glenum func,glint ref,glui...