无锁的环形队列
#ifndef _RingQueue_H_
#define _RingQueue_H_
#include <memory.h>
template<class T, unsigned int MAX_LEN = 1024>
class RingQueue
{
public://-----------------------------------------------------// 構造//-----------------------------------------------------
RingQueue(){m_nHead = 0;m_nTail = 0;}//-----------------------------------------------------// 析構//-----------------------------------------------------~RingQueue(){}//-----------------------------------------------------// 重置,清空隊列//-----------------------------------------------------void Reset(){m_nHead = 0;m_nTail = 0;}//-----------------------------------------------------// 取得最多讀取個數//-----------------------------------------------------unsigned int GetMaxReadSize(){int size = (m_nTail - m_nHead + MAX_LEN) % MAX_LEN;return size;}//-----------------------------------------------------// 取得最多寫入個數//-----------------------------------------------------unsigned int GetMaxWriteSize(){int size = (m_nHead - m_nTail + MAX_LEN - 1) % MAX_LEN; return size;}//-----------------------------------------------------// 添加數據//-----------------------------------------------------bool PushData(const T* pData, unsigned int nLength = 1){if (pData == nullptr || nLength > GetMaxWriteSize()){return false;}if (m_nTail + nLength <= MAX_LEN){memcpy(m_Buffer + m_nTail, pData, nLength * sizeof(T));m_nTail = (m_nTail + nLength) % MAX_LEN;}else{unsigned int size1 = MAX_LEN - m_nTail;unsigned int size2 = nLength - size1;memcpy(m_Buffer + m_nTail, pData, size1 * sizeof(T));memcpy(m_Buffer, pData+size1, size2 * sizeof(T));m_nTail = size2;}return true;}//-----------------------------------------------------// 取出并刪除數據//-----------------------------------------------------bool PopData(T* pData, unsigned int nLength = 1){if (pData == nullptr || nLength > GetMaxReadSize() || nLength <= 0){return false;}if (m_nHead + nLength <= MAX_LEN){memcpy(pData, m_Buffer + m_nHead, nLength * sizeof(T));m_nHead = (m_nHead + nLength) % MAX_LEN;}else{unsigned int size1 = MAX_LEN - m_nHead;unsigned int size2 = nLength - size1;memcpy(pData, m_Buffer + m_nHead, size1 * sizeof(T));memcpy(pData + size1, m_Buffer, size2 * sizeof(T));m_nHead = size2;}return true;}//-----------------------------------------------------// 查看數據 不刪除//-----------------------------------------------------bool PeekData(T* pData, unsigned int nLen){if (nLen > GetMaxReadSize() || nLen <= 0){return false;}if (m_nHead + nLen <= MAX_LEN){memcpy(pData, m_Buffer + m_nHead, nLen * sizeof(T));}else{unsigned int size1 = MAX_LEN - m_nHead;unsigned int size2 = nLen - size1;memcpy(pData, m_Buffer + m_nHead, size1 * sizeof(T));memcpy(pData + size1, m_Buffer, size2 * sizeof(T));}return true;}//-----------------------------------------------------// 刪除數據//-----------------------------------------------------bool DeleteData(unsigned int nLen){if (nLen > GetMaxReadSize() || nLen <= 0){return false;}if (m_nHead + nLen <= MAX_LEN ){m_nHead = (m_nHead + nLen) % MAX_LEN;}else{m_nHead = nLen - (MAX_LEN - m_nHead);}return true;}public:T m_Buffer[MAX_LEN]; // 數據區
private:unsigned int m_nHead; // 隊頭unsigned int m_nTail; // 隊尾
};#endif
?
轉載于:https://www.cnblogs.com/zzyoucan/p/4216454.html
總結
- 上一篇: 首次办信用卡额度一般是多少?掌握这几招轻
- 下一篇: 农行燃梦信用卡可以曲线吗?看你下卡额度多