#include <pthread.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
typedef int buffer_item;
#define BUFFER_SIZE 5
int sum[BUFFER_SIZE] = {-1,-1,-1,-1,-1}; // Variable compartida para todos los hilo.
int insert_item(buffer_item item){
int i = 0;
while(sum[i] != -1){
if(i-1 == BUFFER_SIZE)
return -1;
i++;
}
sum[i] = item;
return 0;
}
int remove_item(){
int i;
i = BUFFER_SIZE-1;
while(sum[i] == -1){
if(i == 0)
return -1;
i--;
}
sum[i] = -1;
return 0;
}
void *Producer(){
buffer_item rand_value;
int sleep_value;
while (1) {
/* dormir durante un periodo de tiempo aleatorio */
sleep_value = rand()%5+1;
sleep(sleep_value);
/* genera un numero aleatorio */
rand_value = rand()%10+1;
printf("Se produjo %d\n",rand_value);
if(insert_item(rand_value))
printf("%d ingreso correctamente.\n",rand_value);
else
printf("%d no pudo ingresar, buffer lleno.\n",rand_value);
}
}
void *Consumer()
{
int sleep_value;
while (1) {
sleep_value=(rand()%5+1);
sleep(sleep_value);
if(remove_item())
printf("Item eliminador con exito\n");
else
printf("Error, Buffer vacio\n");
}
}
int main(int argc, char *argv[])
{
pthread_t tid, tid1; // Identificadores de los hilos
pthread_attr_t attr; // Seteo de atributos de los hilos.
pthread_attr_init (&attr) ; // Atributos normales para los hilos.
pthread_create(&tid, &attr, Producer(), argv[1]); // Crea el hilo
pthread_create(&tid1, &attr, Consumer(), argv[1]); // Crea el segundo hilo
/* compute_some_stuff();*/
pthread_join (tid1); // Espera a que el hilo salga antes de continuar
pthread_join (tid);
printf("Producer y Consumer corrieron");
return 0;
}