环形缓存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

posted @ 2018-06-22 17:16  Andy_Yin  阅读(2084)  评论(0编辑  收藏  举报