记录 环形缓冲区RingBuffer实现(基于Linux内核Kfifo)

本文介绍了一个基于Linux内核Kfifo实现的环形缓存类,提供了初始化、读写等核心功能,并采用互斥锁保证线程安全。

说明

该专栏的上一篇文章记录了一种缓冲区的实现,可以先移步阅读 记录 队列数据缓冲区(FiFoBuffer)
总的来说,缓冲区的设计基本思路大同小异。甚至申请一块内存,通过memcpy memmove两个函数就能实现基本的缓存功能(就是有点粗糙,效率没那么高)。因此根据应用解决的问题场景不同,所以某些细节实现、改进优化也是有所不同。
此环形缓存借鉴Linux内核的Kfifo队列实现,这里修改了代码,封装为缓冲区类,可以直接复制使用。这里必须赞一下,编程是门艺术,Linux内核代码写的确实牛逼,代码简洁、清晰、巧妙、高效,很少花里胡哨的骚操作,直达本质。同时字里行间体现深厚的计算机底层功力,难以望其项背。

代码

相关环形缓存的文章较多,原理也并不是很复杂。不同的是,Linux内核的Kfifo实现个人认为做到了比较极致的境界,不在赘述,直接上代码。

  1. 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲁国周公子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值