环形缓存RingBuf的几种实现方式(数组,链表),及Disruptor的分析
先贴个头文件的设计:
首先缓冲区中没有任何数据时,nIdWrite、nIdRead读写下标都为0。
为了判断缓冲区中是否还有数据可读或者可写,我判断的依据是:
1)当nIdWrite 等于 nIdRead时,表示缓冲区内没有任何数据可读;否则存在可读的数据
2)当剩余的空间小于我们所需要的空间时,表示缓冲区不能再继续写数据,否则可以进行写数据
3)这里说明一下,当剩余空间 等于 我们所需要的空间时,实际上也可以进行写数据的, 只不过需要用一个标记来标记缓冲区是否有数据。
否则,这个时候nIdWrite ** 等于 **nIdRead, 无法区分缓冲区到底是有数据还是满了的情况!
//C++编写了一个环形缓冲区,实际上是用数组来进行模拟。
#pragma once class RingBuffer
{
public:
RingBuffer();
~RingBuffer();
public:
char* createRingBuf(int nByteSize); bool writeRingBuf(char* ringBuf, char* pSrc, int nByteSize);
bool readRingBuf(char* ringBuf, char* pBuffer,int &nByteSize);
private:
bool isCanRead(char* ringBuf);// 判断是否可以再进行读操作
bool isCanWrite(char* ringBuf, int nByteSize);// 判读剩余的空间是否能够容纳nByteSize字节的数据
int getFreeOfRingBuf(char* ringBuf);// 计算剩余的空间大小 int getBytesOfRingBuf(char* ringBuf);/*从环形缓冲区获取可写字节数*/
int flushRingBuf(char* ringBuf);/*清环形缓冲区空间*/
private:
int m_nIdWrite; // 读下标标记
int m_nIdRead; // 写下标标记
};
参考链接:
https://www.cnblogs.com/dodng/p/4367791.html
https://blog.csdn.net/ds1130071727/article/details/78528626
https://blog.csdn.net/blade2001/article/details/7094232
环形缓存RingBuf的几种实现方式(数组,链表),及Disruptor的分析的更多相关文章
- 聊聊db和缓存一致性的5种实现方式
数据存储在数据库中,为了加快业务访问的速度,我们将数据库中的一些数据放在缓存中,那么问题来了,如何确保db和缓存中数据的一致性呢?我们列出了5种方法,大家都了解一下,然后根据业务自己选择. 方案1 获 ...
- js里常见的三种请求方式$.ajax、$.post、$.get分析
$.post和$.get是$.ajax的一种特殊情况: $.post和$.get请求都是异步请求,回调函数里写return来返回值是无意义的, 回调函数里对外部变量进行赋值也是无意义的. 即使是$.a ...
- Web APi之认证(Authentication)两种实现方式【二】(十三)
前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...
- 转 Web APi之认证(Authentication)两种实现方式【二】(十三)
前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到 ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
- 全面剖析Smarty缓存机制一[三种缓存方式]
今天主要全面总结下Smarty模板引擎中强大的缓存机制,缓存机制有效减少了系统对服务器的压力,而这也是很多开发者喜欢Smarty的原因之一,由于篇幅较大,便于博友阅读,这篇文章将剖析Smarty缓存的 ...
- Ajax请求被缓存的几种处理方式
Ajax请求被缓存的几种处理方式 我们都知道IE会针对ajax请求的地址缓存请求结果,直到缓存过期之前,针对相同地址发出的请求,只有第一次会请求会真正发送到服务端.在某种情况下,这种缓存机制确实能提高 ...
- 基于Metronic的Bootstrap开发框架经验总结(11)--页面菜单的几种呈现方式
在常规的后台管理系统或者前端界面中,一般都有一个导航菜单提供给用户,方便选择所需的内容.基于Metronic的Bootstrap开发框架,是整合了Metroinc样式,以及Boostrap组件模块的内 ...
- Redis两种持久化方式(RDB&AOF)
爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...
随机推荐
- Android Studio gradle编译 NullPointerException(no error message)解决
原文:Android Studio gradle编译 NullPointerException(no error message)解决 1.关闭Android Studio 2.找到工程目录下的 . ...
- iOS判断当前时间是否处于某个时间段内
/** * 判断当前时间是否处于某个时间段内 * * @param startTime 开始时间 * @param expireTime 结束时间 */ - (BOOL)validateWithSta ...
- WinForm DataGridView制作表格
1. 将背景颜色改为白色 this.dataGridView1.BackgroundColor = Color.White; 或 2. 禁止启用添加,启用编辑,启用删除 this.dataGridV ...
- 编解码TIFF图像
解码: // Open a Stream and decode a TIFF image Stream imageStreamSource = new FileStream("tulipfa ...
- .net core 利用Selenium和PhantomJS后台生成EChart图片
1.引用 NuGet安装: Selenium.Support Selenium.WebDriver Selenium.WebDriver.PhantomJS.CrossPlatform (分布Lin ...
- CentOS7 firewall与iptables防火墙的使用与开放端口
如何关闭firewall并开启iptables防火墙 如何使用firewall防火墙 如何关闭firewall并开启iptables防火墙 1.停止firewall systemctl stop fi ...
- Delphi指针运用理解
现在是面向对象漫天飞的年代了,大家都在在谈面向对象编程.Java对指针“避而不谈”,C#虽然支持指针运用,但是也淡化处理. 然而,指针还是好完全掌握为妙,省得在开发过程碰钉子,至于对指针的运用在于开发 ...
- android核心系列--1,组件生命周期
一,进程模型及进程托管 1,一个APP应用是由一个或多个组件构成的,这些组件可以运行在一个进程中,也可以分别运行在多个进程中: 进程的构造和销毁是由系统全权负责的. 2,一个应用进程只有一个应用环境对 ...
- pycharm安装及配置全过程
首先要准备两个文件,一是pycharm-community,二是python-3.7.2-amd. PyCharm 的下载地址:http://www.jetbrains.com/pycharm/dow ...
- rm、shutdown、磁盘挂载、vi使用方法
1. 系统管理文件 1.1 rm 文件与目录有关命令 删除命令 (慎用) --- 数据是否备份了 rm === remove rm /oldboy/oldboy.txt --- 删除文件 rm ...