头文件
#pragma once #include <atomic> //#include <mutex> class CCycleBuffer { public: bool isFull(); bool isEmpty(); void empty(); int getReadableLength(); int getWriteableLength(); CCycleBuffer(int size); virtual~CCycleBuffer(); int write(char* buf, int count); int read(char* buf, int count); int getStart() { return m_nReadPos; } int getEnd() { return m_nWritePos; } private: std::atomic_bool m_bEmpty, m_bFull; char* m_pBuf; int m_nBufSize; std::atomic_int m_nReadPos; std::atomic_int m_nWritePos; //std::mutex m_mutex; int test; };
cpp文件
#include "CCycleBuffer.h" #include <assert.h> #include <memory.h> // 定义 CCycleBuffer::CCycleBuffer(int size) { m_nBufSize = size; m_nReadPos = 0; m_nWritePos = 0; m_pBuf = new char[m_nBufSize]; m_bEmpty = true; m_bFull = false; test = 0; } CCycleBuffer::~CCycleBuffer() { delete[] m_pBuf; } /************************************************************************/ /* 向缓冲区写入数据,返回实际写入的字节数 */ /************************************************************************/ int CCycleBuffer::write(char* buf, int count) { std::atomic_int m_nReadPos; m_nReadPos = (int)this->m_nReadPos; if (count <= 0) return 0; // 缓冲区已满,不能继续写入 if (m_bFull) { return 0; } else if (m_nReadPos == m_nWritePos)// 缓冲区为空时 { /* == 内存模型 == |← m_nBufSize →| |← (empty)→ ← (empty) →| |------------||------------------------------| ↑← leftcount →| m_nReadPos m_nWritePos */ int leftcount = m_nBufSize - m_nWritePos; if (leftcount > count) { memcpy(m_pBuf + m_nWritePos, buf, count); //m_mutex.lock(); m_nWritePos += count; m_bFull = (this->m_nReadPos == m_nWritePos); //m_mutex.unlock(); m_bEmpty = false; return count; } else { std::atomic_int tmp; <