无锁循环缓冲区的实现c语言,C++无锁循环缓冲队列

[c++]代码库#ifndef min

#define min(a,b) (((a) < (b)) ? (a) : (b))

#endif

#ifndef max

#define max(a,b) (((a) > (b)) ? (a) : (b))

#endif

// 无锁缓冲队列.

class circular_buffer

{

public:

circular_buffer ( int buf_size )

: m_buffer_size ( buf_size )

, m_circle_buffer ( NULL )

, m_write_p ( 0 )

, m_read_p ( 0 )

{

m_circle_buffer = new char[m_buffer_size];

}

~circular_buffer()

{

if ( m_circle_buffer )

delete[] m_circle_buffer;

m_circle_buffer = NULL;

}

void clear()

{

m_write_p = 0;

m_read_p = 0;

}

unsigned int size()

{

return m_buffer_size - ( m_write_p - m_read_p );

}

unsigned int used()

{

return m_write_p - m_read_p;

}

unsigned int put_data ( char* buffer, unsigned int len )

{

unsigned int l;

len = _min ( len, m_buffer_size - m_write_p + m_read_p );

/* first put the data starting from fifo->in to buffer end */

l = _min ( len, m_buffer_size - ( m_write_p & ( m_buffer_size - 1 ) ) );

memcpy ( m_circle_buffer + ( m_write_p & ( m_buffer_size - 1 ) ), buffer, l );

/* then put the rest (if any) at the beginning of the buffer */

memcpy ( m_circle_buffer, buffer + l, len - l );

m_write_p += len;

return len;

}

unsigned int get_data ( char* buffer, unsigned int len )

{

unsigned int l;

len = _min ( len, m_write_p - m_read_p );

/* first get the data from fifo->out until the end of the buffer */

l = _min ( len, m_buffer_size - ( m_read_p & ( m_buffer_size - 1 ) ) );

memcpy ( buffer, m_circle_buffer + ( m_read_p & ( m_buffer_size - 1 ) ), l );

/* then get the rest (if any) from the beginning of the buffer */

memcpy ( buffer + l, m_circle_buffer, len - l );

m_read_p += len;

return len;

}

protected:

inline unsigned int _max ( unsigned int a, unsigned int b )

{

return max ( a, b );

}

inline unsigned int _min ( unsigned int a, unsigned int b )

{

return min ( a, b );

}

private:

int m_buffer_size;

char* m_circle_buffer;

unsigned int m_write_p;

unsigned int m_read_p;

};

694748ed64b9390909c0d88230893790.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值