環形緩衝區的設計與實現

2021-06-06 11:18:02 字數 2383 閱讀 1541

環形緩衝區,顧名思義這個緩衝區是環形的,那麼何謂環形這個意思也很好理解,就是用乙個指標去訪問該緩衝區的最後乙個記憶體位置的的後一位置時回到環形緩衝區的起點。類似乙個環一樣。這樣形容就很好理解了,當然有辦法實現了。我在這裡採用了2種方式實現了環形緩衝區,乙個是用陣列的方法,乙個是用鍊錶的方法。

陣列是一塊連續的記憶體,所以順序訪問時只要根據下標的增加而增加,但是最後乙個元素之後需要回到起始位置,這就需要我們對這個地方進行特殊處理。只要最後乙個位址訪問結束能順利回到起始位址,這個緩衝區就可以實現。**如下:

[cpp]view plain

copy

print?

/* file name: ringbuf.c

* author   : wanxiao

* function :implement a circular buffer, 

you can read and write data in the buffer zone.

*/#include 

#define maxsize 8   

int ringbuf[maxsize];     

int readldx=0;  

int writeldx=0;  

int next_data_handle(int addr)     

int write_data(int data)  

}  int read_data()  

int main(int argc , char **argv)     

}while(cmd != 'q');     

return 0;     

}  

鍊錶實現,實際上就是乙個單向迴圈鍊錶。這個方法的優點是不需要最後乙個元素進行特殊處理,但是實現起來比陣列稍微麻煩一點,單思路還是很清晰簡單的。**如下:

[cpp]view plain

copy

print?

#include 

#include 

typedef

struct signal_loop_chain  

node;  

node *create_loop_chain(int n)  

return head ;  

}  int show(node *head)  

printf("/n");  

}  int read_buf(node *head)  

}  int write_buf(node *head)  

}  int main(int argc , char **argv)  

if(cmd == 'w')  

}  return 0;  

}  

以上都是針對單程序而言。對於系統,尤其是嵌入式linux系統中,緩衝區的保護機制就變得尤為重要了,因為我們的資料時不停的在讀寫,記憶體不停的變化,如果牽扯到多工(多程序,多執行緒),我們就需要加鎖對其進行保護措施。這裡我在鍊錶的實現下加了訊號量加以保護。

[c-sharp]view plain

copy

print?

#include 

#include 

#include 

#include 

sem_t mutex;  

typedef struct signal_loop_chain  

node;  

node *create_loop_chain(int n)  

return head ;  

}  int show(node *head)  

printf("/n");  

}  int read_buf(node *head)  

}  int write_buf(node *head)  

}  int main(int argc , char **argv)  

printf("please input node_num /n");  

scanf("%d",&num);  

head = create_loop_chain(num);  

printf("the ringbuf was found/n");  

show(head);  

ret = pthread_create(&id1,null,(void *)write_buf,head);  

ret = pthread_create(&id2,null,(void *)read_buf,head);  

pthread_join(id1,null);  

pthread_join(id2,null);  

return 0;  

}  

環形緩衝區的實現

乙個簡單的環形緩衝區,沒有寫加解鎖的部分,用於多執行緒的話還是自己加吧.pragma once include stdio.h include stdlib.h include memory.h namespace linker ring bool put elementtype e else bo...

緩衝區設計 環形佇列

目錄 在程式的兩個模組間進行通訊的時候,緩衝區成為乙個經常使用的機制。如上圖,寫入模組將資訊寫入緩衝區中,讀出模組將資訊讀出緩衝區。這樣使得 緩衝區顯然不適合下面的情況 佇列使用環形佇列,如上圖。環形佇列的特點是,不需要進行動態的記憶體釋放和分配,使用固定大小的記憶體空間反覆使用。在實際的佇列插入和...

環形緩衝區

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...