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