環形緩存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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM