C 語言中實現環形緩衝區

2022-10-04 01:42:08 字數 1521 閱讀 3063

1.實現**:

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

printf("nnafter thread_read : %snn",buf);

return null;

} static void * thread_write(void *arg)

return null;

} int main(void)

1.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)的效果一樣。 

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

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

以上就是環形緩衝區域的c語言實現詳解,希望對大家有所幫助,謝謝支援!

本文標題: c 語言中實現環形緩衝區

本文位址:

環形緩衝區C語言實現

環形緩衝區的特性 1 先進新出 2 當緩衝區被使用完,且又有新的資料需要儲存時,丟掉歷史最久的資料,儲存最新資料 現實中的儲存介質都是線性的,因此我們需要做一下處理,才能在功能上實現環形緩衝區 演算法說明 1 phead和ptail分別是連續儲存介質的首位址和尾位址 2 ptail phead 的值...

環形緩衝區C語言實現

typedef unsigned char u8 typedef unsigned int u32 define buffer size 1024 500 緩衝區的長度,可以修改 static u32 validlen 已使用的資料長度 static u8 phead null 環形儲存區的首位址 ...

c 環形緩衝區

public class circularbuffer icollection,ienumerable,icollection,ienumerable public circularbuffer int capacity,bool allowoverflow public bool allowove...