Mi pregunta es la siguiente tengo que realizar con funciones atomic dos funciones iguales a las de un semaforo wait() y signal() para resolver problemas de exclusion mutua y una vez exo al ejecutarlo me da error y no se de ke es alguien me podria explicar por ke?? adjunto el codigo
int buffer[10];
int indEnt=0; // indice del vector en el cual se introducira el proximo numero
int indSal=0; // indice del vector de donde se tomara el proximo numero
int process[10];
int d=0;
atomic void espera(int x){
x--;
if(x < 0){
process[d] = which_proc();
suspend();
d= (d++) %10;
}
}
atomic void sigue(int x){
x++;
if( x <= 0){revive(process[d]);
d= (d--) %10;
}
}
int s; // para controlar el acceso al buffer
int vacio; // para controlar si el buffer está vacio
int lleno=10; // para controlar si el buffer está lleno
// se inicializa al numero de elementos del buffer
// Produce los numeros que se insertan en el buffer
int producir()
{
int num;
num = random(10);
cout<<"Se Produce el numero -> "<<num<<endl<<endl;
return num;
}
// Introduce los numeros producidos en el buffer
void anadir(int x)
{
buffer[indEnt]=x;
indEnt=(indEnt+1)%10; // conseguimos un entero entre 0 y 9 que se corresponde
// con uno de los indices del buffer
}
// Muestra el numero que se extrae del buffer
void consumir(int num)
{
cout<<"Se Extrae el numero-> "<<num<<endl;
}
// Extrae los numeros del buffer
int tomar()
{
int num;
num=buffer[indSal];
indSal=(indSal+1)%10; // actualizo el indice del vector para extraer el proximo
return num;
}
void Productor()
{
int x; // tomara el entero producido
int i;
for(i=0;i < 100; i++)
{
x=producir();
espera(lleno);
espera(s);
anadir(x);
sigue(s);
sigue(vacio);
}
} // fin productor
void Consumidor()
{
int x; // tomara el entero que se extrae
int i;
for(i=0 ;i < 100; i++)
{
espera(vacio); // si el buffer está vacio no puedo consumir
espera(s);
x=tomar();
sigue(s);
sigue(lleno);
consumir(x); // pongo consumir fuera de la seccion critica
}
} // fin consumidor
main()
{
s=1;
vacio=0; // inicialmente el buffer está vacio
cobegin
{
Productor();
Consumidor();
}
} // fin main
Marcadores