您的位置:首页 > 其它

双线程读写无锁队列

2015-10-16 23:17 274 查看
#pragma once

#ifndef __INCLUDE__CIRCLE__QUEUEUE__
#define __INCLUDE__CIRCLE__QUEUEUE__
#include<Windows.h>

const long MAX_LEN = 10000;
template<typename T>
class CCircleQueue
{
public :
CCircleQueue();
BOOL InitQueue(int lQueueLen);
void UnInitQueue();
void Clear();
BOOL PushQueue(T *pNode);
BOOL PopQueue(T* & pNode);

private:
long m_lRPos;
long m_lWPos;
long m_lQueueLen;
T **m_pQueue;/****************************/
BOOL m_bInit;//看是否调用InitQueue函数
/****************************/
};
////////////////////////////////////////////////////////////////////////////
template<typename T>
CCircleQueue<T>::CCircleQueue():m_lQueueLen(0),m_lRPos(0),m_lWPos(0),m_pQueue(NULL),m_bInit(FALSE)
{
}
template<typename T>
BOOL CCircleQueue<T>::InitQueue(int lQueueLen)
{
UnInitQueue();
if(lQueueLen > MAX_LEN)
{
return FALSE;
}
m_lQueueLen = lQueueLen + 1;
m_pQueue = new T * [m_lQueueLen];
/****************************/
//初始化指针赋空
for(int i=0;i<m_lQueueLen;i++)
{
m_pQueue[i] = NULL;
}
/****************************/
m_bInit = TRUE;
return TRUE;
}
template<typename T>
void CCircleQueue<T>::UnInitQueue()
{
/****************************/
/****************************/
if(m_pQueue)
{
for(int i=0;i<m_lQueueLen;i++)
{
if(m_pQueue[i])
{
delete m_pQueue[i];
m_pQueue[i] = NULL;
}
}
delete m_pQueue;
m_pQueue = NULL;
}
m_lQueueLen = 0;
m_lWPos = m_lRPos;
m_bInit = FALSE;
}
template<typename T>
void CCircleQueue<T>::Clear()
{
if(m_bInit == FALSE)
{
return ;
}
for(int i=0;i<m_lQueueLen;i++)
{
if(m_pQueue[i])
{
delete m_pQueue[i];
m_pQueue[i] = NULL;
}
}
}
template<typename T>
BOOL CCircleQueue<T>::PushQueue(T *pNode)
{
if(m_bInit == FALSE)
{
return FALSE;
}
long lNext = (m_lWPos + 1) % m_lQueueLen;
if(lNext == m_lRPos)
{
return FALSE;
}
else
{
//先放后移动
m_pQueue[m_lWPos] = pNode;
m_lWPos = lNext;
}
return TRUE;
}
template<typename T>
BOOL CCircleQueue<T>::PopQueue(T*& pNode)
{
if(m_bInit == FALSE)
{
return FALSE;
}
if(m_lRPos == m_lWPos)
{
return FALSE;
}
else
{
//先取后移动
pNode = m_pQueue[m_lRPos];
/****************************/
m_pQueue[m_lRPos] = NULL;//清空m_pQueue[m_lRPos]这个地方的野指针,否则在调用Clear
//时m_pQueue[m_lRPose]有东西,再次删除崩了,这个地方在main函数已经删除了
/****************************/
m_lRPos = (m_lRPos + 1)% m_lQueueLen;
}
return TRUE;
}

#endif //__INCLUDE__CIRCLE__QUEUEUE__
#include<iostream>
#include"Control.h"
#include"Circle_Queue.h"
#include"MyDao.h"

using namespace std;

class CTest
{
private:
int a;
public :
CTest(int m_a):a(m_a)
{
}
void Print()
{
cout<<a<<endl;
}
};

int main()
{
CCircleQueue<CTest>queue;
if(queue.InitQueue(100) == FALSE)
{
cout<<"Init queue fail"<<endl;
return -1;
}
CTest *p=NULL;
for(int i=0;i<102;i++)
{
p = new CTest (i);
if (FALSE == queue.PushQueue(p))
{
cout<<i<<endl;
delete p ;
cout<<"queue full!"<<endl;
}
}
for(int i=0;i<101;i++)
{
if (TRUE == queue.PopQueue(p))
{
p->Print();
}
else
{
delete p;
cout<<"queue empty!"<<endl;
break;
}
}

queue.Clear();
queue.UnInitQueue();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: