miércoles, 5 de octubre de 2011

examen adin

#include
#include
#include

#define N 5
#define IZQ (i-1)%N
#define DER (i+1)%N
#define TOMA 0
#define AGARRAOTRO 1
#define COME 2


pthread_t filos[N];
sem_t mutex ;
sem_t s[N];
int estado [N] ;



void aga (int i)
{
int t ;
t = rand() % 11;
printf("Filosofo %d agarra un palillo \n", i) ;
estado[i] = TOMA;
sleep (t) ;
}



void comer (int i)
{
printf("Filósofo %d agarra otro palillo \n", i);
estado[i] = COME;
sleep (5);
}



void agar(int i)
{
if( estado[i]==AGARRAOTRO && estado[IZQ]!=COME && estado[DER]!=COME ){
estado[i] = COME;
printf("Filósofo %d comiendo\n", i) ;
sem_post(&s[i]);
}
}



void toma_tndrs(int i)
{

sem_wait(&mutex);
estado[i] = AGARRAOTRO;
agar(i);
sem_post(&mutex);
sem_wait(&s[i]);
}



void deja_tndrs(int i)
{

sem_wait(&mutex);
estado[i] = TOMA;
agar(IZQ);
agar(DER);
sem_post(&mutex);
}


void * filosofos (int i)
{
int j ;


for (; ; )
{
aga(i) ;
toma_tndrs(i) ;
comer(i) ;
deja_tndrs(i) ;
}
}


main()
{
int i ;


for(i = 0; i < 5; i++){
sem_init (&s[i], 0, 1);


estado[i] = TOMA ;
}


sem_init (&mutex, 0, 1);


for (i=0; ipthread_create(&filos[i], NULL, (void *)filosofos,(void *) i);


for (i=0; ipthread_join(filos[i],NULL);
}

}