環形緩衝區的實現原理(ring buffer)

2021-06-11 18:47:03 字數 1142 閱讀 4576

在通訊程式中,經常使用環形緩衝區作為資料結構來存放通訊中傳送和接收的資料。環形緩衝區是乙個先進先出的迴圈緩衝區,可以向通訊程式提供對緩衝區的互斥訪問。

1、環形緩衝區的實現原理

環形緩衝區通常有乙個讀指標和乙個寫指標。讀指標指向環形緩衝區中可讀的資料,寫指標指向環形緩衝區中可寫的緩衝區。通過移動讀指標和寫指標就可以實現緩衝區的資料讀取和寫入。在通常情況下,環形緩衝區的讀使用者僅僅會影響讀指標,而寫使用者僅僅會影響寫指標。如果僅僅有乙個讀使用者和乙個寫使用者,那麼不需要新增互斥保護機制就可以保證資料的正確性。如果有多個讀寫使用者訪問環形緩衝區,那麼必須新增互斥保護機制來確保多個使用者互斥訪問環形緩衝區。

圖1、圖2和圖3是乙個環形緩衝區的執行示意圖。圖1是環形緩衝區的初始狀態,可以看到讀指標和寫指標都指向第乙個緩衝區處;圖2是向環形緩衝區中新增了乙個資料後的情況,可以看到寫指標已經移動到資料塊2的位置,而讀指標沒有移動;圖3是環形緩衝區進行了讀取和新增後的狀態,可以看到環形緩衝區中已經新增了兩個資料,已經讀取了乙個資料。

2、例項:環形緩衝區的實現

環形緩衝區是資料通訊程式中使用最為廣泛的資料結構之一,下面的**,實現了乙個環形緩衝區:

/*ringbuf .c*/

#include

#include

#define nmax 8

int iput = 0; /* 環形緩衝區的當前放入位置 */

int iget = 0; /* 緩衝區的當前取出位置 */

int n = 0; /* 環形緩衝區中的元素總數量 */

double buffer[nmax];

/* 環形緩衝區的位址編號計算函式,如果到達喚醒緩衝區的尾部,將繞回到頭部。

*/int addring (int i)

/* 從環形緩衝區中取乙個元素 */

double get(void)

else

/* 向環形緩衝區中放入乙個元素*/

void put(double z)

else

printf(「buffer is full/n」);

}int main/* end switch */

}while(opera[0] != 』e』);

return 0;

}

環形緩衝區的實現原理

在通訊程式中,經常使用環形緩衝區作為資料結構來存放通訊中傳送和接收的資料。環形緩衝區是乙個先進先出的迴圈緩衝區,可以向通訊程式提供對緩衝區的互斥訪問。1 環形緩衝區的實現原理 環形緩衝區通常有乙個讀指標和乙個寫指標。讀指標指向環形緩衝區中可讀的資料,寫指標指向環形緩衝區中可寫的緩衝區。通過移動讀指標...

環形緩衝區的實現

乙個簡單的環形緩衝區,沒有寫加解鎖的部分,用於多執行緒的話還是自己加吧.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...