日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C++無鎖循環(huán)緩沖實(shí)現(xiàn)

 gljin_cn 2016-06-05
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
// 無鎖緩沖隊(duì)列.
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 available()
   {
      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;
};

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多