環形buffer的管理

來源:互聯網
上載者:User

環形buffer這個資料結構經常被用到,
環形buffer一般用數組來實現,需要有一個頭指標和
尾指標,如果帶一個計數器來表示環形buffer可用的
元素個數,那麼整個buffer都可以被有效使用,但對計算機

的訪問需要加互斥保護,如果
沒有計數器,為了區別buffer空和滿的情況,必須要
留一個元素空間不使用,這個在資料結構的書上都有
分析,有沒有辦法使得我們在使用環形buffer時,既
不需要計數器,又可以不浪費buffer的空間,使每個
元素空間都能被有效使用呢?我這裡有個方法,不知
到對不對,請大家分析一下。

#define BUF_CNT 10

typedef BUF_ITEM int;
typedef BUF_RESULT int;

BUF_ITEM buffer [ BUF_CNT ];

int pos_put = 0;
int pos_get = 0;

/* 從buffer裡取出一個item ------consumer*/
BUF_RESULT get_item ( BUF_ITEM&  data )
{
 if ( pos_get == pos_put )
  return EMPTY;

 data = buffer [ pos_get++ % BUF_CNT ];
 return OK;
}

/* 把一個item放入到buffer裡 -----producer */
BUF_RESULT put_item ( BUF_ITEM& data )
{
 if ( pos_put - pos_get >= BUF_CNT )
  return FULL;

 buffer [ pos_put++ % BUF_CNT ] = data;
 return OK;
}

這個方法的關鍵是兩個指標都是單調遞增的(暫不考慮溢出的情形),
這樣就避免了指標迴繞時發生重疊的問題。既兩個指標只會在buffer
為空白的時候相等,buffer為滿的時候不會相等,傳統的演算法如果不加
額外的限制條件,在buffer為空白和為滿的時候指標都會相等。請大家
認真分析。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.