環形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為空白和為滿的時候指標都會相等。請大家
認真分析。