[C++] C++无锁循环缓冲队列 →→→→→进入此内容的聊天室

来自 , 2020-01-03, 写在 C++, 查看 112 次.
URL http://www.code666.cn/view/0e087ec5
  1. #ifndef min
  2. #define min(a,b) (((a) < (b)) ? (a) : (b))
  3. #endif
  4.  
  5. #ifndef max
  6. #define max(a,b) (((a) > (b)) ? (a) : (b))
  7. #endif
  8.  
  9. // 无锁缓冲队列.
  10. class circular_buffer
  11. {
  12. public:
  13.         circular_buffer ( int buf_size )
  14.                         : m_buffer_size ( buf_size )
  15.                         , m_circle_buffer ( NULL )
  16.                         , m_write_p ( 0 )
  17.                         , m_read_p ( 0 )
  18.         {
  19.                 m_circle_buffer = new char[m_buffer_size];
  20.         }
  21.  
  22.         ~circular_buffer()
  23.         {
  24.                 if ( m_circle_buffer )
  25.                         delete[] m_circle_buffer;
  26.                 m_circle_buffer = NULL;
  27.         }
  28.  
  29.         void clear()
  30.         {
  31.                 m_write_p = 0;
  32.                 m_read_p = 0;
  33.         }
  34.  
  35.         unsigned int size()
  36.         {
  37.                 return m_buffer_size - ( m_write_p - m_read_p );
  38.         }
  39.  
  40.         unsigned int used()
  41.         {
  42.                 return m_write_p - m_read_p;
  43.         }
  44.  
  45.         unsigned int put_data ( char* buffer, unsigned int len )
  46.         {
  47.                 unsigned int l;
  48.                 len = _min ( len, m_buffer_size - m_write_p + m_read_p );
  49.                 /* first put the data starting from fifo->in to buffer end */
  50.                 l = _min ( len, m_buffer_size - ( m_write_p & ( m_buffer_size - 1 ) ) );
  51.                 memcpy ( m_circle_buffer + ( m_write_p & ( m_buffer_size - 1 ) ), buffer, l );
  52.                 /* then put the rest (if any) at the beginning of the buffer */
  53.                 memcpy ( m_circle_buffer, buffer + l, len - l );
  54.                 m_write_p += len;
  55.                 return len;
  56.         }
  57.  
  58.         unsigned int get_data ( char* buffer, unsigned int len )
  59.         {
  60.                 unsigned int l;
  61.                 len = _min ( len, m_write_p - m_read_p );
  62.                 /* first get the data from fifo->out until the end of the buffer */
  63.                 l = _min ( len, m_buffer_size - ( m_read_p & ( m_buffer_size - 1 ) ) );
  64.                 memcpy ( buffer, m_circle_buffer + ( m_read_p & ( m_buffer_size - 1 ) ), l );
  65.                 /* then get the rest (if any) from the beginning of the buffer */
  66.                 memcpy ( buffer + l, m_circle_buffer, len - l );
  67.                 m_read_p += len;
  68.                 return len;
  69.         }
  70.  
  71. protected:
  72.         inline unsigned int _max ( unsigned int a, unsigned int b )
  73.         {
  74.                 return max ( a, b );
  75.         }
  76.  
  77.         inline unsigned int _min ( unsigned int a, unsigned int b )
  78.         {
  79.                 return min ( a, b );
  80.         }
  81.  
  82. private:
  83.         int m_buffer_size;
  84.         char* m_circle_buffer;
  85.         unsigned int m_write_p;
  86.         unsigned int m_read_p;
  87. };
  88.  

回复 "C++无锁循环缓冲队列"

这儿你可以回复上面这条便签

captcha