環形緩衝區

2021-04-18 09:39:46 字數 1370 閱讀 6793

#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_buffer ;

static struct cycle_buffer *fifo = null;

static int init_cycle_buffer(void)

unsigned int fifo_get(unsigned char *buf, unsigned int len)

unsigned int fifo_put(unsigned char *buf, unsigned int len)

static void * thread_read(void *arg)

return null;

}static void * thread_write(void *arg)

return null;

}int main(void)

buffer指向存放資料的緩衝區,size是緩衝區的大小,in是寫指標下標,out是讀指標下標,在len和(fifo->size - fifo->in + fifo->out)之間取乙個較小的值賦給len。注意,當(fifo->in == fifo->out+fifo->size)時,表示緩衝區已滿,此時得到的較小值一定是0,後面實際寫入的位元組數也全為0。另一種邊界情況是當len很大時(因為len是無符號的,負數對它來說也是乙個很大的正數),這一句也能保證len取到乙個較小的值,因為fifo->in總是大於等於fifo->out,所以後面的那個表示式的值不會超過fifo->size的大小把上一步決定的要寫入的位元組數len「切開」,這裡又使用了乙個技巧。注意:實際分配給fifo->buffer的位元組數fifo->size,必須是2的冪,否則這裡就會出錯。既然fifo->size是2的冪,那麼(fifo->size-1)也就是乙個後面幾位全為1的數,也就能保證(fifo->in & (fifo->size - 1))總為不超過(fifo->size - 1)的那一部分,和(fifo->in)% (fifo->size - 1)的效果一樣。

這樣後面的**就不難理解了,它先向fifo->in到緩衝區末端這一塊寫資料,如果還沒寫完,在從緩衝區頭開始寫入剩下的,從而實現了迴圈緩衝。最後,把寫指標後移len個位元組,並返回len。

從上面可以看出,fifo->in的值可以從0變化到超過fifo->size的數值,fifo->out也如此,但它們的差不會超過fifo->size

環形緩衝區

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

環形緩衝區

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