119 lines
2.7 KiB
C++
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;
|
|
};
|
|
//*************************************************************************
|
|
};
|