utiles_v2017/gcola_con.h

119 lines
2.7 KiB
C++

#pragma once
#include "gcola.h"
#include "lock.h"
//cola concurrente para usar con multiples thread
template <typename T>
class Cgcola_con :
public Cgcola<T>
{
public:
//variables--------------------------------------------------------------------------------
Clock cerrojo;//interlock para protejer la cola
int modo;//modo 0 bloqueante, modo 1 no bloqueante
//funciones--------------------------------------------------------------------------------
//*************************************************************************
Cgcola_con(void)
:Cgcola()
{
modo=0;
};
//*************************************************************************
virtual ~Cgcola_con(void)
{
borra();
};
//*************************************************************************
//*************************************************************************
virtual inline T* operator++()//da puntero al ultimo elemento
{
T* res=NULL;
if (modo)
{
if(!cerrojo.puedo())
return NULL;
}
else
cerrojo.entro();
res= Cgcola::operator++();
cerrojo.salgo();
return res;
};
//*************************************************************************
virtual inline T* operator--()//da puntero al primero
{
T* res=NULL;
if (modo)
{
if(!cerrojo.puedo())
return NULL;
}
else
cerrojo.entro();
res= Cgcola::operator--();
cerrojo.salgo();
return res;
};
//*************************************************************************
virtual inline BOOL operator+(T &e )//añade al final
{
BOOL res=FALSE;
if (modo)
{
if(!cerrojo.puedo())
return FALSE;
}
else
cerrojo.entro();
res= Cgcola::operator+(e);
cerrojo.salgo();
return res;
};
//*************************************************************************
virtual inline BOOL operator-(T &e) //añade al principio
{
BOOL res=FALSE;
if (modo)
{
if(!cerrojo.puedo())
return FALSE;
}
else
cerrojo.entro();
res= Cgcola::operator-(e);
cerrojo.salgo();
return res;
};
//*************************************************************************
virtual inline BOOL operator+=(T* e )//da el ultimo y lo elimina
{
BOOL res=FALSE;
if (modo)
{
if(!cerrojo.puedo())
return FALSE;
}
else
cerrojo.entro();
res= Cgcola::operator+=(e);
cerrojo.salgo();
return res;
};
//*************************************************************************
virtual inline BOOL operator-=(T* e )//da el primero y lo elimina
{
BOOL res=FALSE;
if (modo)
{
if(!cerrojo.puedo())
return FALSE;
}
else
cerrojo.entro();
res= Cgcola::operator-=(e);
cerrojo.salgo();
return res;
};
//*************************************************************************
};