线程安全的环形缓冲区实现

本文介绍了线程安全的环形缓冲区实现,应用于线程1向缓冲区写入音频采样点,线程2按固定数量取出数据进行编码。该缓冲区基于内存段,采用C++实现,包含详细注释,并使用自定义的锁对象保证多线程同步。不过,目前尚不具备自动扩展内存功能,未来计划进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:http://blog.csdn.net/lezhiyong
    应用背景:线程1将每次数量不一的音频采样点(PCM音频数据)写入环形缓冲区,线程2每次取固定数量采样点送音频编码器,线程1线程2在平均时间内的读写数据量相等。(倒入桶中的水量有时大有时小,但每次取一瓢喝:)
   该环形缓冲区借鉴CoolPlayer音频播放器中的环形缓冲区代码实现,在读写操作函数中加了锁,允许多线程同时操作。CPs_CircleBuffer基于内存段的读写,比用模板实现的环形缓冲队列适用的数据类型更广些, CPs_CircleBuffer修改成C++中基于对象的实现,加上详细注释,m_csCircleBuffer锁变量为自用的lock类型(将CRITICAL_SECTION封装起来),调用lock()加锁,调用unlock()解锁。使用效果良好,分享出来。

CPs_CircleBuffer环形缓冲还不具备当待写数据量超出空余缓冲时自动分配内存的功能,这个将在后续进行优化。

CPs_CircleBuffer使用步骤:

1、创建对象
CPs_CircleBuffer* m_pCircleBuffer;
m_pCircleBuffer = new CPs_CircleBuffer(bufsize);
2、写
if (m_pCircleBuffer->GetFreeSize() < CIC_READCHUNKSIZE)
 {
     Sleep(20);
     continue;
 }
m_pCircleBuffer->Write(internetbuffer.lpvBuffer,internetbuffer.dwBufferLength);
3、读
m_pCircleBuffer->Read(pDestBuffer,iBytesToRead, piBytesRead);
 
4、其他调用
if(m_pCircleBuffer->IsComplete())
    break;        
iUsedSpace =m_pCircleBuffer->GetUsedSize();
m_pCircleBuffer->SetComplete();

CPs_CircleBuffer修改为类的定义:

class  CPs_CircleBuffer
{
public:
	   CPs_CircleBuffer(const unsigned int iBufferSize);
	   ~CPs_CircleBuffer();
public:
        // Public functions
        void  Uninitialise();
        void  Write(const void* pSourceBuffer, const unsigned int iNumBytes);
        bool  Read(void* pDestBuffer, const size_t iBytesToRead, size_t* pbBytesRead);
        void  Flush();
        unsigned int GetUsedSize();
        unsigned int GetFreeSize();
        void  SetCo
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值