手撕代码系列(二)—— 实现RingBuffer环形缓冲区,也称循环队列

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被写入缓冲区中部(对于环形缓冲区来说,最初的写入位置在哪里是无关紧要的):

写入两个元素,分别是23,这两个元素被追加到1之后:

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值