面向对象的方式实现环形缓冲区
作者: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