在开发时常常需要使用循环队列、看到python中的Queue线程安全的队列、自己也想实现一个。
没什么好说的、代码:
#pragma once
#include <Windows.h>
template<class T>
class CMyCirQueue
{
private:
T* const head;
size_t size;
size_t startPos;
size_t endPos;
volatile size_t currSize;
CRITICAL_SECTION lock;
CONDITION_VARIABLE varPush;
CONDITION_VARIABLE varGet;
bool ExitFlag;
public:
CMyCirQueue(size_t numOfnode = 50);
~CMyCirQueue(void);
public:
bool push(const T& value);
bool get(T& value);
const size_t qsize();
bool empty();
void release();
};
template<class T>
CMyCirQueue<T>::CMyCirQueue(size_t numOfnode):
head(new T[numOfnode]),size(numOfnode),
startPos(0),endPos(0),currSize(0)
{
InitializeCriticalSection(&lock);
InitializeConditionVariable(&varGet);
InitializeConditionVariable(&varPush);
ExitFlag = false;
}
template<class T>
CMyCirQueue< T>::~CMyCirQueue(void)
{
release();
}
template<class T>
bool CMyCirQueue< T>::empty()
{
if(qsize() == 0)
return true;
return false;
}
template<class T>
bool CMyCirQueue< T>::push(const T& value)
{
EnterCriticalSection(&lock);
while(!ExitFlag && currSize == size){
SleepConditionVariableCS(&varPush,&lock,INFINITE);
}
if(ExitFlag){
LeaveCriticalSection(&lock);
return false;
}
head[endPos] = value;
endPos = (endPos + 1) % size;
++currSize;
LeaveCriticalSection(&lock);
WakeConditionVariable(&varGet);
return true;
}
template<class T>
bool CMyCirQueue< T>::get(T& value)
{
EnterCriticalSection(&lock);
while(!ExitFlag && currSize == 0){
SleepConditionVariableCS(&varGet,&lock,INFINITE);
}
if(ExitFlag){
LeaveCriticalSection(&lock);
return false;
}
value = head[startPos];
startPos = (startPos + 1) % size;
--currSize;
LeaveCriticalSection(&lock);
WakeConditionVariable(&varPush);
return true;
}
template<class T>
const size_t CMyCirQueue< T>::qsize()
{
return currSize;
}
template<class T>
void CMyCirQueue< T>::release()
{
if(ExitFlag == false){
ExitFlag = true;
WakeAllConditionVariable(&varGet);
WakeAllConditionVariable(&varPush);
DeleteCriticalSection(&lock);
}
if(head){
delete[] head;
head = NULL;
}
}