在开发时常常需要使用循环队列、看到python中的queue线程安全的队列、自己也想实现一个。
没什么好说的、代码:
#pragma once
#include
template
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
cmycirqueue::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
cmycirqueue< t>::~cmycirqueue(void)
{
release();
}
template
bool cmycirqueue< t>::empty()
{
if(qsize() == 0)
return true;
return false;
}
template
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
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
const size_t cmycirqueue< t>::qsize()
{
return currsize;
}
template
void cmycirqueue< t>::release()
{
if(exitflag == false){
exitflag = true;
wakeallconditionvariable(&varget);
wakeallconditionvariable(&varpush);
deletecriticalsection(&lock);
}
if(head){
delete[] head;
head = null;
}
}