说明
该专栏的上一篇文章记录了一种缓冲区的实现,可以先移步阅读 记录 队列数据缓冲区(FiFoBuffer)
总的来说,缓冲区的设计基本思路大同小异。甚至申请一块内存,通过memcpy memmove两个函数就能实现基本的缓存功能(就是有点粗糙,效率没那么高)。因此根据应用解决的问题场景不同,所以某些细节实现、改进优化也是有所不同。
此环形缓存借鉴Linux内核的Kfifo队列实现,这里修改了代码,封装为缓冲区类,可以直接复制使用。这里必须赞一下,编程是门艺术,Linux内核代码写的确实牛逼,代码简洁、清晰、巧妙、高效,很少花里胡哨的骚操作,直达本质。同时字里行间体现深厚的计算机底层功力,难以望其项背。
代码
相关环形缓存的文章较多,原理也并不是很复杂。不同的是,Linux内核的Kfifo实现个人认为做到了比较极致的境界,不在赘述,直接上代码。
- RingBuffer.h
#ifndef RINGBUFFER_H
#define RINGBUFFER_H
#include <mutex>
//判断x是否是2的次方
#define is_power_of_two(x) ((x) != 0 && (((x) & ((x) - 1)) == 0))
//取a和b中最小值
#define Min(a, b) (((a) < (b)) ? (a) : (b))
//环形缓存
class RingBuffer
{
public:
RingBuffer();
~RingBuffer();
//根据传入size 初始化缓冲区
bool initBuffer(uint32_t bufferSize);
//释放缓冲区
void freeBuffer();
//重置缓冲区(不需要重新申请内存)
void resetBuffer();
//缓存区是否为空
bool isEmpty();
//缓存区是否已满
bool isFull();
//返回可读数据长度
uint32_t getReadableLen();
//返回剩余空闲长度
uint32_t getRemainLen

本文介绍了一个基于Linux内核Kfifo实现的环形缓存类,提供了初始化、读写等核心功能,并采用互斥锁保证线程安全。
&spm=1001.2101.3001.5002&articleId=127314299&d=1&t=3&u=4b04a7dfaed94ffba3837d7b5e5d98a3)
688

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



