菜鸟笔记
提升您的技术认知

循环队列-ag真人官方网

在开发时常常需要使用循环队列、看到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;
	}
}

 

网站地图