linux c 迴圈緩衝區模板類

2022-07-17 06:18:09 字數 2747 閱讀 5275

一:概述

實際學習和工作中,我們經常會遇到讀寫大量資料的情況,這個時候我們可能就用到了迴圈緩衝區。

迴圈緩衝區在處理大量資料的時候有很大的優點,迴圈緩衝區在一些競爭問題上提供了一種免鎖的機制,免鎖的前提是,生產者和消費都只有乙個的情況下,否則也要加鎖。

二:迴圈緩衝區的實現理論如下圖

三:實現**如下所示:

//

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()

};

下面是簡單的測試**:

//

main.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()

編譯:g++ main.cpp -lpthread -o test

這個迴圈緩衝佇列大體的功能已經實現,其中迴圈緩衝佇列一些其他操作並沒有去實現,只是描述了一些核心的操作!

如果有錯誤和其他意見,提出來大家一起相互討論和學習!

迴圈緩衝區類

乙個迴圈緩衝區的實現類。思路 分配乙個固定緩衝區,利用緩衝區讀寫資料。當寫到緩衝區底部而讀指標不在緩衝區頂部時,則寫指標移動到緩衝區頂部,繼續寫操作。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...