#pragma once
#include "TSemaphore.h"
#include "TLock.h"
//支持多读多写
#ifndef TMULTIRWQUEUE_H
#define TMULTIRWQUEUE_H
template <class T>
class TMultiRWQueue
{
public:
typedef T Element;
private:
Element* m_Head; //队列起点
Element* m_Tail; //对列终点
Element* m_Put; //下一个写入位置
Element* m_Get; //下一个读取位置
TSemaphore m_semaGet; //可以读取的资源量
TSemaphore m_semaPut; //可以写入的资源量
TMutexLock m_lockPut; //写入时同步锁
TMutexLock m_lockGet; //读取时同步锁
int m_uiSize; //队列总长度
bool m_bInit;
public :
//初始化,创建对列
TMultiRWQueue();
~TMultiRWQueue();
bool init(int iSize);
//执着放入一个数据(没有空间就一直等待)
bool put(Element& data);
//执着取出一个数据(没有数据就一直等待)
bool get(Element& data);
//积极放入一个数据(没有空间片刻后返回)
bool tryPut(Element& data);
//积极取出一个数据(没有数据片刻后返回)
bool tryGet(Element& data);
//得到当前队列中数据个数
int getCount();
private:
//放入数据的过程
bool myPut(Element& data);
//取出数据的过程
bool myGet(Element& data);
};