一个简单的环形缓冲区,没有写加解锁的部分,用于多线程的话还是自己加吧.
#pragmaonce
#include"stdio.h"
#include"stdlib.h"
#include"memory.h"
namespaceLinker
{
template<typenameElementType,unsignedintSize/*,typenameLockName*/>
classRing
{
public:
Ring()
{
//::memset(_elements,0,sizeof(ElementType));
_first=0;
_last=0;
_size=Size;
_fullSize=Size-1;
}
~Ring(){}
boolPut(ElementType&e)
{
if(!IsFull())
{
_elements[_last++]=e;
_last%=_size;
returntrue;
}
else
{
returnfalse;
}
}
boolGet(ElementType&e)
{
if(IsEmpty())
{
returnfalse;
}
else
{
e=_elements[_first++];
_first%=_size;
returntrue;
}
}
unsignedintInUse()
{
if(_last>_first)
{
return_last-_first;
}
elseif(_first>_last)
{
return_size-(_first-_last);
}
else
{
return0;
}
}
unsignedintFreeElementNum()
{
return_fullSize-InUse();
}
unsignedintTotalSize()
{
return_fullSize;
}
boolIsFull()
{
returnInUse()==_fullSize;
}
boolIsEmpty()
{
returnInUse()==0;
}
protected:
unsignedint_size;
unsignedint_fullSize;
ElementType_elements[Size];
unsignedint_first;
unsignedint_last;
//LockName_lock;
};
测试代码:
#include"Ring.h"
#include"stdio.h"
usingnamespaceLinker;
intmain()
{
unsignedintj=1;
Ring<unsignedint,12>clockRing;
printf("StartInUse:%d ",clockRing.InUse());
clockRing.Put(j);
clockRing.Put(j);
printf("AfterPut1,1InUse:%d ",clockRing.InUse());
clockRing.Get(j);
for(unsignedinti=0;i<12;i++)
clockRing.Put(i);
clockRing.Get(j);
j=100;
clockRing.Put(j);
for(unsignedinti=0;i<12;i++)
{
if(clockRing.Get(j))
printf("%d ",j);
else
printf("Empty!");
}
printf("Get1,Put0-11,Get1,Put100,Get*12timesInUse:%d ",clockRing.InUse());
}
说实话,这个类刚刚出炉没有仔细测试,如果有Bug -_-! 还请告诉我一下哈~
分享到:
相关推荐
STM32进阶之串口环形缓冲区实现 FIFO,代码精简,易实现。
这种处理方式是没有缓冲区的,当数量太大的时候,亦或者当数据接收太快的时候,我们来不及处理已经收到的数据, 那么,当再次收到数据的时候,就会将之前还未处理的数据覆盖掉。那么就会出现丢包的现象了,对我们的...
在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。
环形缓冲区实现类(RingBuffer)
两种方式实现环形缓冲区,很实用,希望对你有帮助!
通用FIFO环形缓冲区实现的开源库.zip
该工程包含了整个实现代码,并添加了注释,提供了软件计时器多任务创建及调度接口函数,以及环形缓冲区完整接口函数。
免锁环形缓冲区实现单片机共享数据处理的同步.pdf
环形缓冲区的用途及原理可以去百度资料狠多的,这里就不介绍了。代码分别用D7,XE2编译测试
Go中的线程安全循环缓冲区(环形缓冲区),实现了io.ReaderWriter接口
为了解决这个问题,决定设计并实现一个环形缓冲区来进行数据接收管理。环形缓冲区是一种高效的数据结构,适用于数据产生速率快于消费速率的场景。它具有固定大小的缓冲区,并且可以循环利用空间,保证数据的连续存储...
该例程使用eclipse IDE,演示了UART串口环形缓冲区的C语言实现代码,并将printf函数重映射到UART串口实现调试信息的打印输出。环形缓冲区的实现思路参照该链接:https://www.cnblogs.com/zengzy/p/5139582.html。...
设计了一个环形字节缓冲区类,可用于通信数据收发的缓冲处理。类的读写及查看接口已经加上了多线程同步访问锁
C语言实现环形缓冲区,可供多线程读写操作
1.高速通信下,环形缓冲区设计及实现;可直接使用演示。 2.包括:服务端和客户端。说明:SOCKET通信非常简略,只为环形缓冲区测试使用,也适合初学都学习。 其他:里面包含SOCKET通信客户端/服务器演示,还包括了...
使用环形存储缓冲区实现串口通讯的接收 ,环形缓冲存储区源代码
环形缓冲区读写操作的分析与实现.。。。。。。。。。。。
STM32使用环形缓冲区去接收和发送数据,值得收藏,很经典。
自己实现了一个环形缓冲区的简单类,并且做了一个TCP 服务端对这个类进行了用法演示