zoukankan      html  css  js  c++  java
  • 环形缓存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

  • 相关阅读:
    List注意点【修改】
    最近遇到的笔试面试题(3)
    关于阅读
    各种语言
    最近遇到的笔试面试题(2)
    最近遇到的笔试面试题(1)
    5自由落体运动
    4 1000以内完数
    3水仙花数
    判断101-200之间的素数
  • 原文地址:https://www.cnblogs.com/AndrewYin/p/9214443.html
Copyright © 2011-2022 走看看