template<class T,unsigned int ArrayNum=3>//用3个数组,替代锁
class CCircleQueue
{
public:
CCircleQueue()
{
m_nUsePos = 0;
}
////切换资源结束
void SwitchSourceEnd()
{
if (m_nUsePos+1 == ArrayNum)
{ //是最后一个下标
m_nUsePos = 0;
}
else
{
++m_nUsePos;
}
}
//切换资源开始
T* SwitchSourceBeg()
{
if (m_nUsePos + 1 == ArrayNum)//2
{
return m_pData;//m_pData[0]
}
else
{
return m_pData + (m_nUsePos + 1)%ArrayNum;//m_pData[1],m_pData[2]
}
}
//获得切换前的资源
T* GetIdleSource()
{
if (m_nUsePos>0)
{
return m_pData+(m_nUsePos-1)%ArrayNum;
}
else
{
return m_pData + ArrayNum - 1; //取最后一个数据
}
}
//获得当前可用资源
T* GetUseSource()
{
return m_pData+m_nUsePos%ArrayNum;
}
void UpdateSource(const T& refSource)
{
*SwitchSourceBeg() = refSource;
SwitchSourceEnd();
}
unsigned int GetQueueSize()
{
return ArrayNum;
}
protected:
unsigned char m_nUsePos;
T m_pData[ArrayNum];
};
class CCircleQueue
{
public:
CCircleQueue()
{
m_nUsePos = 0;
}
////切换资源结束
void SwitchSourceEnd()
{
if (m_nUsePos+1 == ArrayNum)
{ //是最后一个下标
m_nUsePos = 0;
}
else
{
++m_nUsePos;
}
}
//切换资源开始
T* SwitchSourceBeg()
{
if (m_nUsePos + 1 == ArrayNum)//2
{
return m_pData;//m_pData[0]
}
else
{
return m_pData + (m_nUsePos + 1)%ArrayNum;//m_pData[1],m_pData[2]
}
}
//获得切换前的资源
T* GetIdleSource()
{
if (m_nUsePos>0)
{
return m_pData+(m_nUsePos-1)%ArrayNum;
}
else
{
return m_pData + ArrayNum - 1; //取最后一个数据
}
}
//获得当前可用资源
T* GetUseSource()
{
return m_pData+m_nUsePos%ArrayNum;
}
void UpdateSource(const T& refSource)
{
*SwitchSourceBeg() = refSource;
SwitchSourceEnd();
}
unsigned int GetQueueSize()
{
return ArrayNum;
}
protected:
unsigned char m_nUsePos;
T m_pData[ArrayNum];
};
本文介绍了一种使用模板类实现的循环队列无锁设计方案,通过三个数组交替使用来避免传统同步机制如锁带来的性能开销。文章详细展示了如何在不使用锁的情况下通过更新数组指针来达到线程安全的目的。
735

被折叠的 条评论
为什么被折叠?



