基本概念
环形缓冲区一种遵循FIFO(先进先出)的存储空间,它的主要特点是首尾相连形成了闭环。这种结构允许数据在达到缓冲区末尾时自动回绕到起始位置,从而实现数据的循环存储和管理。下图是一种形象理解。
通俗地来讲,它也是一种线性表,由一个数组和两个表示读写状态的指针构成。在这个线性表被定义地第一时间,读指针与写指针指向同一个数组元素;当我们写入了一个数据之后,读指针会依旧指向第一个元素但写指针会按照写入方向依次指向下一个元素。如果写指针的下一个指向是读指针所在的元素,代表这个环形缓冲区已经写满。
功能与优势
- 存储和管理数据:环形缓冲区可以存储一定数量的数据,并在数据满后通过覆盖最早的数据来继续存储新数据,实现“先进先出”(FIFO)的数据管理方式。
- 高效利用空间:通过循环存储,环形缓冲区能够高效地利用有限的缓存空间,避免数据的丢失,并减少内存分配和释放的开销。
- 快速读写操作:环形缓冲区的插入和删除操作通常只涉及头指针和尾指针的移动,时间复杂度为O(1),这使得它在实时或高性能应用中具有显著优势。
- 支持多线程和并发操作:通过适当的同步机制,如互斥锁或信号量,环形缓冲区可以支持多个读取者和写入者并发地访问和操作数据。
操作方法与代码示例
利用结构体构建环形buff
#define RingBuffer_Size 8
typedef struct {
int w;
int r;
int buffer[RingBuffer_Size];
}RingBuffer_Type;
初始化环形缓冲区域
让读指针与写指针指向同一个数组元素
/*初始化环形缓冲区的方法是让
读写标记指针都指向同一个线性表元素*/
void RingBuffer_Init(RingBuffer_Type *rb)
{
rb->w = 0;
rb->r = 0;
for (int i = 0; i < RingBuffer_Size; i++)
rb->buffer[i] = 0;
}
判断环形buffer状态
判断是否满:写入的下一位是否位读
/*判断buffer是否填满*/
int RingBuffer_Is_Full(RingBuffer_Type* rb)
{
return (((rb->w) + 1) % RingBuffer_Size == (rb->r));
}
判断是否空:读和写的指向在同一位
/*判断buffer是否为空*/
int RingBuffer_Is_Empty(RingBuffer_Type* rb)
{
return(rb->r==rb->w);
}