//执着放入一个数据(没有空间就一直等待)
template <class T>
bool TMultiRWQueue<T>::put(Element& data)
{
if (!m_bInit)
{
return false;
}
//获得空闲信号量通知
if (!m_semaPut.Wait())
{
return false;
}
//放入元素
myPut(data);
//释放占用信号量
if (!m_semaGet.Release())
{
return false;
}
return true;
}
//执着取出一个数据(没有数据就一直等待)
template <class T>
bool TMultiRWQueue<T>::get(Element& data)
{
if (!m_bInit)
{
return false;
}
//获得占用信号量通知
if (!m_semaGet.Wait())
{
return false;
}
//取出元素
myGet(data);
//释放空闲信号量
if (!m_semaPut.Release())
{
return false;
}
return true;
}
//积极放入一个数据(没有空间片刻后返回)
template <class T>
bool TMultiRWQueue<T>::tryPut(Element& data)
{
bool bSuccess = false;
bSuccess = m_semaPut.Wait(POC_THREAD_BLOCK_TIMEOUT);
if (bSuccess)
{
//放入元素
myPut(data);
//释放占用信号量
m_semaGet.Release();
}
return bSuccess;
}
//积极取出一个数据(没有数据片刻后返回)
template <class T>
bool TMultiRWQueue<T>::tryGet(Element& data)
{
bool bSuccess = false;
//获得空闲信号量通知
bSuccess = m_semaGet.Wait(POC_THREAD_BLOCK_TIMEOUT);
if (bSuccess)
{
//取出元素
myGet(data);
//释放空闲信号量
m_semaPut.Release();
}
return bSuccess;
}