环状队列

简单的多线程安全环状队列,pop,push失败则会返回。需要加入pop,push失败时等待功能

#ifndef _SAFE_LOOP_QUEUE
#define _SAFE_LOOP_QUEUE

#include <mutex>
#include <condition_variable>

template<typename _Ty>
class  SafeLoopQueue
{
public:

	SafeLoopQueue(size_t capacity) :_data(nullptr), _capacity(0), _front(0), _tear(0)
	{

	}

	~SafeLoopQueue()
	{
		if (_data) { delete[]_data; _data = nullptr; }
	}

	void QueueAlloc(size_t capacity) 
	{
		try
		{
			_data = new _Ty[capacity];
			_capacity = capacity;

		}
		catch (...)
		{
		}
	}

	bool Push(_Ty &vlaue)
	{
		std::unique_lock<std::mutex> lck(_mutex);
		if (!_isFull())
		{
			_data[_tear] = vlaue;
			_tear = (_tear + 1) % _capacity;
			_size++;
			return true;
		}
		else
		{
			return false;
		}
	}

	bool Pop(_Ty &value)
	{
		std::unique_lock<std::mutex> lck(_mutex);
		if (!_isEmpty())
		{
			value = _data[_front];
			_front = (_front + 1) % _capacity;
			_size--;
			return true;
		}
		else
		{
			return false;
		}

	}


private:

	bool _isEmpty() { return (_size == 0); }

	bool _isFull() { return (_size == _capacity); }


	std::mutex _mutex;
	
	
	size_t _capacity;            //总容量
	size_t _size;                //当前容量
	size_t _front;               //front
	size_t _tear;                //tear
	_Ty *_data;
};

#endif // !_SAFE_LOOP_QUEUE 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值