环形缓冲区
环形缓冲区(ring buffer)也称作循环缓冲区(cyclic buffer)、圆形队列(circular queue)、圆形缓冲区(circular buffer)。环形缓冲区并不是指物理意义上的一个首尾相连成“环”的缓冲区,而是逻辑意义上的一个环,因为内存空间是线性结构,所以实际上环形缓冲区仍是一段有长度的内存空间,是一个先进先出功能的缓冲区,具备实现通信进程对该缓冲区的互斥访问功能。
Step1:创建一个长度为Len(环形缓冲区大小)的容器
Steo2:创建一个读指针Read_p与写指针Write_p,写指针写入的地址为Write_p = (Write_p + W_len(写入数据长度))%Len
Step3:根据读指针进行读取缓冲区数据
带有指针的结构体内存大小分配
typedef struct Ring_buffer {
char **log;
int index;
int buffer_size;
}Ring_buffer;
分配
在分配时先分配给Ring_buffer,再分配给Ring_buffer中的log.代码如下所示:
void InitRingBuffer(Ring_buffer* buffer, int buffer_size) {
buffer -> log = (char**)malloc(buffer_size * sizeof(char*));
for(int i = 0; i < buffer_size; i++) {
buffer -> log[i] = (char *)malloc(Ring_char_max * sizeof(char));
}
buffer -> index = 0;
buffer -> buffer_size = buffer_size;
}
释放
与分配的顺序相反,代码如下所示:
void FreeRingBuffer(Ring_buffer* buffer) {
for(int i = 0; i < buffer -> index; i++) {
free(buffer -> log[i]);
}
free(buffer -> log);
}