Problema dos filosofos
O problema:
O problema das filosofos consiste em fazer um jantar, onde todas as crianças comam. Porem, entre cada filosofo sentado na mesa ha apenas um talher entre elas, e para comer, cada uma precisara dos dois talheres de seu lado para comer. Elas podem fazer duas coisas (comer ou pensar). Outra observação é que as crianças não podem conversar entre si, o que pode gerar uma deadlock.
Boas soluções:
-ausencia de deadlock
-ausencia de starvation
-auto grau de paralelismo.
Código:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h> #define N 5
#define LEFT (i+N-1)%N
#define RIGHT (i+1)%N
#define THINKING 0
#define HUNGRY 1
#define EATING 2 int state[N], i, int_rand; float float_rand; //semaforos sem_t mutex; sem_t sem_fil[N]; //funcao que mostra o estado das N crianças void mostrar(){ for(i=1; i<=N; i++){ if(state[i-1] == THINKING){ printf("A criança %d esta pensando!\n", i); } if(state[i-1] == HUNGRY){ printf("A criança %d esta com fome!\n", i); } if(state[i-1] == EATING){ printf("A criança %d esta comendo!\n", i); } } printf("\n");
}
//acao da criança void *acao_ crianca (void *j){ int i= *(int*) j; while(1){ pensar(i); pegar_garfo(i); comer(i); por_garfo(i); } } void pegar_garfo(int i){ sem_wait(&mutex); state[i]=HUNGRY; mostrar(); test(i); sem_post(&mutex); sem_wait(&sem_fil[i]);
}
void por_garfo(int i){ sem_wait(&mutex); state[i]=THINKING; mostrar(); test(LEFT); test(RIGHT); sem_post(&mutex);
}
//funcao que testa se a criança pode comer void test(int i){ if(state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING){