环形字节缓冲区源代码

设计了一个环形字节缓冲区类,可用于通信数据收发的缓冲处理。类的读写及查看接口已经加上了多线程同步访问锁。

环形缓冲区需要有一个读指针(位置)和写指针(位置)。其中读指针由读数据接口来移动,写指针由写数据接口来移动。在读出和写入数据时,要分贝考虑 读指针超前与滞后写指针 两种情况。 


(一)头文件:CircleByteBuffer.h

#ifndef CIRCLEBYTEBUFFER_H
#define CIRCLEBYTEBUFFER_H

 

#include <windows.h>

 

//临界区锁
class CLock_CS
{
public:
 CLock_CS(void)
 {
  ::InitializeCriticalSection(&m_cs);
 }

 virtual~CLock_CS(void)
 {
  ::DeleteCriticalSection(&m_cs);
 }

 void Lock(void)
 {
  ::EnterCriticalSection(&m_cs);
 }

 void Unlock(void)
 {
  ::LeaveCriticalSection(&m_cs);
 }

private:
 CRITICAL_SECTION m_cs;
};

 

//自动锁
class CAutoLock
{
public:
 CAutoLock(CLock_CS & lock)
  : m_lock(lock)
 {
  m_lock.Lock();
 }

 virtual~CAutoLock()
 {
  m_lock.Unlock();
 }

private:
 CLock_CS & m_lock;
};

 

//环形字节缓冲区
class CCircleByteBuffer
{
public:
 CCircleByteBuffer(int nSize);
 virtual~CCircleByteBuffer();

 int Write(char * pData, int len);
 int Read(char * pData, int len);
 bool IsFull();
 bool IsEmpty();

private:
 int DataLength() const;
 int FreeLength() const;

private:
 CLock_CS m_cs;
 int   m_nSize;
 int   m_nRead;
 int   m_nWrite;
 char *  m_pBuf;
};


#endif //CIRCLEBYTEBUFFER_H

 


 

(二)实现文件:CircleByteBuffer.cpp

 

#include "stdafx.h"
#include "CircleByteBuffer.h"

CCircleByteBuffer::CCircleByteBuffer(int nSize)
: m_nSize(nSize)
, m_nRead(0)
, m_nWrite(m_nRead)
{
 m_pBuf = new char [m_nSize];
}

CCircleByteBuffer::~CCircleByteBuffer()
{
 delete [] m_pBuf;
}

int CCircleByteBuffer::Write(char * pData, int len)
{
 CAutoLock lock(m_cs);

 if (len <= 0)
  return 0;

 int free_len = FreeLength() - 1;
 if (free_len <= 0)
  return 0;
 
 int nData = (free_len >= len) ? len : free_len;
 if (m_nRead > m_nWrite) {
  memcpy(m_pBuf + m_nWrite, pData, nData);
  m_nWrite += nData;
 }
 else {
  int tail_len = m_nSize - m_nWrite;
  tail_len = (tail_len >= nData) ? nData : tail_len;
  memcpy(m_pBuf + m_nWrite, pData, tail_len);
  m_nWrite = (m_nWrite + tail_len) % m_nSize;
  memcpy(m_pBuf, pData + tail_len, nData - tail_len);
 }

 return nData;
}

int CCircleByteBuffer::Read(char * pData, int len)
{
 CAutoLock lock(m_cs);

 if (len <= 0)
  return 0;

 int data_len = DataLength();
 if (data_len <= 0)
  return 0;

 int nData = (data_len >= len) ? len : data_len;
 if (m_nWrite > m_nRead) {
  memcpy(pData, m_pBuf + m_nRead, nData);
  m_nRead += nData;
 }
 else {
  int tail_len = m_nSize - m_nRead;
  tail_len = (tail_len >= nData) ? nData : tail_len;
  memcpy(pData, m_pBuf + m_nRead, tail_len);
  m_nRead = (m_nRead + tail_len) % m_nSize;
  memcpy(pData + tail_len, m_pBuf, nData - tail_len);
 }

 return nData;
}

bool CCircleByteBuffer::IsFull()
{
 CAutoLock lock(m_cs);
 return (FreeLength() == 1);
}

bool CCircleByteBuffer::IsEmpty()
{
 CAutoLock lock(m_cs);
 return (m_nWrite == m_nRead);
}

int CCircleByteBuffer::DataLength() const
{
 int len = m_nWrite - m_nRead;
 if (len < 0)
  len = m_nSize + len;
 return len;
}

int CCircleByteBuffer::FreeLength() const
{
 int len = m_nRead - m_nWrite;
 if (len <= 0)
  len = m_nSize + len;

 return len;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux系统,可以使用C语言来实现环形缓冲区的代码。具体的实现步骤包括:首先,定义一个缓冲区数组;其次,设置缓冲区的读写指针;然后,使用循环检查读写指针的值;最后,通过移动读写指针来实现环形缓冲区的读写操作。 ### 回答2: 环形缓冲区也称为循环缓冲区或者环形队列,可以在Linux下使用C语言来实现。 首先,我们需要定义一个环形缓冲区的数据结构,包括缓冲区的大小和当前的读写位置。 ```c #define BUFFER_SIZE 10 typedef struct { int buffer[BUFFER_SIZE]; int read_index; int write_index; } CircularBuffer; ``` 在初始化环形缓冲区时,将读写位置都设置为0即可。 ```c void init(CircularBuffer *circular_buffer) { circular_buffer->read_index = 0; circular_buffer->write_index = 0; } ``` 进行数据的写入时,将数据写入缓冲区,并将写位置加1。如果写位置超过了缓冲区的大小,则将写位置重置为0。 ```c void write(CircularBuffer *circular_buffer, int data) { circular_buffer->buffer[circular_buffer->write_index] = data; circular_buffer->write_index = (circular_buffer->write_index + 1) % BUFFER_SIZE; } ``` 进行数据的读取时,将数据从缓冲区读出,并将读位置加1。如果读位置超过了缓冲区的大小,则将读位置重置为0。 ```c int read(CircularBuffer *circular_buffer) { int data = circular_buffer->buffer[circular_buffer->read_index]; circular_buffer->read_index = (circular_buffer->read_index + 1) % BUFFER_SIZE; return data; } ``` 这样,我们就可以通过调用这些函数来实现环形缓冲区了。当缓冲区满时,写入新数据会覆盖缓冲区的旧数据;当缓冲区为空时,读取数据将无效。 需要注意的是,在多线程环境下操作环形缓冲区时需要保证线程安全,可以使用互斥锁或者其他同步机制来实现。 ### 回答3: 在Linux下实现环形缓冲区的代码可以通过使用数组和指针来实现。下面是一个简单的实现: ```c #include <stdio.h> #define BUFFER_SIZE 10 int buffer[BUFFER_SIZE]; int* read_ptr = buffer; int* write_ptr = buffer; void put(int value) { *write_ptr = value; write_ptr = (write_ptr + 1) % BUFFER_SIZE; } int get() { int value = *read_ptr; read_ptr = (read_ptr + 1) % BUFFER_SIZE; return value; } int main() { // 将环形缓冲区初始化为0 for (int i = 0; i < BUFFER_SIZE; i++) { buffer[i] = 0; } // 向缓冲区添加数据 put(1); put(2); put(3); // 从缓冲区读取数据 int value1 = get(); int value2 = get(); printf("value1: %d\n", value1); // 输出:value1: 1 printf("value2: %d\n", value2); // 输出:value2: 2 return 0; } ``` 在这个实现,我们使用了一个固定大小的整数数组`buffer`作为环形缓冲区。`BUFFER_SIZE`表示缓冲区的大小。我们使用两个指针`read_ptr`和`write_ptr`分别指向读取和写入缓冲区的位置。 `put`函数用于将一个值写入缓冲区,`get`函数用于从缓冲区读取一个值。在`put`函数,首先将传入的值写入`write_ptr`指向的位置,然后更新`write_ptr`指针的位置,将其设置为`(write_ptr + 1) % BUFFER_SIZE`,以实现循环。在`get`函数,首先将`read_ptr`指向的值赋给`value`变量,然后更新`read_ptr`指针的位置,将其设置为`(read_ptr + 1) % BUFFER_SIZE`。最后,我们可以通过调用`put`和`get`函数向缓冲区写入和读取数据。 以上是一个简单的环形缓冲区实现的示例代码。实际使用时,可能需要添加更多的错误处理和同步机制,以确保缓冲区的正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值