双线程读写无锁队列

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值