1. 特性描述
Ring Buffer称作环形缓冲区,也称作循环队列,是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。
在任务间的通信、串口数据收发、log缓存、网卡处理网络数据包、音频/视频流处理中均有环形缓冲区(ring buffer) 的应用。

本次要实现的RingBuffer的基本特性如下:
Front: 从队首获取元素。如果队列为空,返回默认值。Rear: 获取队尾元素。如果队列为空,返回默认值。InQueue(value): 向RingBuffer插入一个元素。如果成功插入则返回真。DeQueue(): 从RingBuffer中删除一个元素。如果成功删除则返回真。IsEmpty(): 检查RingBuffer是否为空。IsFull(): 检查RingBuffer是否已满。- 固定容量Capacity,必须是 2 的幂
- 存储任意类型,因此需要使用模板编程
进阶特性:
- 支持移动语义,减少不必要的拷贝,特别适合大对象或不可拷贝但可移动的类型
- 支持多线程环境下的无锁并发读写(使用atomic),单生产者单消费者场景下线程安全
- 内部使用 64字节缓存行对齐(使用alignas特性),避免伪共享问题
2. 工作过程
先不要想环形缓冲区(ring buffer)的具体实现细节,来看一个简单的例子。如下是一个空间大小为 7的环形缓冲区,其中底部的单线箭头表示“头尾相连”形成一个环形地址空间:

假定1被写入缓冲区中部(对于环形缓冲区来说,最初的写入位置在哪里是无关紧要的):

再写入两个元素,分别是2和3,这两个元素被追加到1之后:

如果读出两个元素,那么环形缓冲区中最老的两个元素将被读出(先进先出原则)。在本例中1和2被读出,缓冲区中剩下3:

紧接着,向缓冲区中写入六个元素4、5、6、7、8、9,这时缓冲区会被装满:

最低0.47元/天 解锁文章
8560

被折叠的 条评论
为什么被折叠?



