#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; i
for (i=0; i
}
}