(C语言)用面向对象的方式实现环形buffer

本文介绍如何使用面向对象的方式在C语言中实现环形缓冲区,包括ring_buffer.h和ring_buffer.c的代码实现,以及测试用例main.c。环形缓冲区类似于循环队列,提供无锁的数据单向流通,简化多线程间的读写操作。文中重点讨论了与循环队列的不同之处,如缓冲区元素为1字节,写入字节数可变等特性。
摘要由CSDN通过智能技术生成

面向对象的方式实现环形缓冲区

作者:bluce
时间:2020.1.1
新的一年继续努力
希望此次示例能让读者学会如何实现和操作一个ring buffer以及如何利用面向对象的思维方式简单设计C语言类。
ring buffer的原理与循环队列的原理相似,笔者就不在赘述。
环形的容器最大的优点便是无需读写锁便可以实现一对读写线程之间的数据单向流通,在实际编程中能够给程序员带来许多便利之处。

与循环队列主要不同
①环形缓冲区的每一项都是1字节,
②每次写入缓冲的字节数是不一定的,当要写的字节数小于缓冲区的可写空间时,会只写入一部分数据,并返回实际写入的字节数。读取也类似
.

代码组成

  • ring_buffer.h
  • ring_buffer.c
  • 测试用例:main.c

ring_buffer.h

#include <windows.h>

typedef unsigned char Byte;

/*--------------- 缓冲区结构体 ---------------*/
typedef struct TBufferDataTag TBufferData;
struct TBufferDataTag
{
    Byte    *items;         ///<缓冲区首地址
    Byte    *end;           ///<缓冲区尾地址

    Byte    *write_ptr;     ///<写指针
    Byte    *read_ptr;      ///<读指针

    DWORD   size;          ///<总的缓冲区字节数
    DWORD   write_size;    ///<写字节数
    DWORD   read_size;     ///<读字节数
};
typedef TBufferData* TBuffer;

/*--------------- 构造和析构函数 ---------------*/

/**
* 构造函数
* @param data:对象指针
* @param buffer:外部缓冲区指针
* @param size:外部缓冲区大小
* @return
* - NULL:初始化失败
* - !NULL:初始化成功
*/
TBuffer TBuffer_Init(TBufferData* data, void *buffer, int size);

/**
* 析构函数
* @param data:对象指针
*/
void TBuffer_Fini(TBufferData* data);


/*--------------- 功能函数 ---------------*/

/**
* 写缓冲区
* @param object:对象
* @param data:写入缓冲区的数据地址
* @param data_size:需写入缓冲区的数据字节数
* @return
* - -1:参数错误
* - 0:未写入数据
* - 其他正整数:实际写入字节数
*/
int TBuffer_Push(TBuffer object, const void *data, const int data_size);

/**
* 读缓冲区
* @param object:对象
* @para
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值