緩衝環形佇列

2021-08-19 04:58:25 字數 991 閱讀 2773

在程式的兩個模組間進行通訊的時候,緩衝區成為乙個經常使用的機制。

寫入模組將資訊寫入緩衝區中,讀出模組將資訊讀出緩衝區。這樣使得:

緩衝區顯然不適合下面的情況:

緩衝區的設計:

佇列使用環形佇列,如上圖。環形佇列的特點是,不需要進行動態的記憶體釋放和分配,使用固定大小的記憶體空間反覆使用。在實際的佇列插入和彈出操作中,是不斷交叉進行的。空佇列時頭指標和尾指標重合且都為0,當分配乙個記憶體時head(頭指標)加1;當釋放乙個記憶體時tail(尾指標)加1。這樣就實現了先入先出。當入隊操作時,head會增加;而出隊操作時,tail會增加。入隊的速度快的時候,head有可能追上 tail,這個時候說明佇列已經滿了,不能再進行入隊的操作了,需要等待出隊 操作騰出佇列的空間。當 出隊 的操作快,使得 tail 追上 head,這個時候說明佇列已空了,不能再進行出隊 操作了,需要等待 入隊 進來資料。

下面是c語言程式設計常用到的語句:       head:隊頭

tail:隊尾      

·  初始化,head = tail = 0;          length:佇列長度

·  出佇列,tail = (tail + 1) % length; //隊尾在不超過31時加1,超過時隊尾值如程式所示

·  入佇列,head = (head + 1) % length; //隊頭在不超過31時加1,超過時隊頭值如程式所示

·  判斷佇列滿,(head + 1) % length == tail;   //例如:隊尾為5,隊頭為4時 ,則表明佇列已滿

·  判斷佇列空,tail==head。                 //只要隊頭與隊尾重合就表明隊列為空

在入佇列前應判斷佇列是否已滿,在出佇列前應判斷佇列是否已空

至此,我們可以總結一下:

這裡,我們設計並實現了環形佇列的資料結構,並也為這個結構能夠定製存放到共享記憶體設計好了方針策略。但下面的工作,將更富於挑戰性:

環形緩衝區 環形緩衝佇列學習

專案中需要執行緒之間共享乙個緩衝fifo佇列,乙個執行緒往佇列中添資料,另乙個執行緒取資料 經典的生產者 消費者問題 開始考慮用stl的vector容器,但不需要隨機訪問,頻繁的刪除最前的元素引起記憶體移動,降低了效率。使用linklist做佇列的話,也需要頻繁分配和釋放結點記憶體。於是自己實現乙個...

緩衝區設計 環形佇列

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

環形緩衝佇列技術應用例項

png解析度1080x800 方案2 提前把所有png載入到記憶體,並且繪製成qpixmap 用vector實現環形佇列,定義乙個qpixmap型別的qvector容器,用於儲存位圖影象。qvectorslicebuffer 設定佇列深度,預先從磁碟載入少量位圖影象。define slicedata...