/* * Implementação assimétrica do jantar dos filósofos * utilizando futex. */ #include #include #include #include #include "myfutex.h" #include #define N 15 #define N_CICLOS 8 char estado[N]; /* * garfo esq = phil_id * garfo dir = (phil_id + 1) % N */ void fica_com_fome(int phil_id) { estado[phil_id] = 'H'; printf("Filósofo %d está faminto!\n", phil_id); sleep(1); } void come(int phil_id) { estado[phil_id] = 'E'; printf("Filósofo %d está comendo!\n", phil_id); sleep(1); } void pega_garfo_esq(int phil_id) { /* Espera garfo esquerdo */ printf("Filósofo %d pegou garfo esquerdo!\n", phil_id); sleep(1); } void pega_garfo_dir(int phil_id) { int dir = (phil_id + 1) % N; /* Espera garfo direito */ printf("Filósofo %d pegou garfo direito!\n", phil_id); sleep(1); } void solta_garfos_pensa(int phil_id) { int dir = (phil_id + 1) % N; /* Libera garfos */ estado[phil_id] = 'T'; printf("Filósofo %d está pensando!\n", phil_id); sleep(1); } void* f_phil(void *v) { int phil_id = *(int *) v; int i; for (i = 0; i < N_CICLOS; i++) { fica_com_fome(phil_id); if (phil_id % 2) { pega_garfo_dir(phil_id); pega_garfo_esq(phil_id); } else { pega_garfo_esq(phil_id); pega_garfo_dir(phil_id); } come(phil_id); solta_garfos_pensa(phil_id); } return NULL; } int main() { pthread_t thr[N]; int i, phil_id[N]; for (i = 0; i < N; i++) { estado[i] = 'T'; } for (i = 0; i < N; i++) { phil_id[i] = i; pthread_create(&thr[i], NULL, f_phil, (void*) &phil_id[i]); } for (i = 0; i < N; i++) pthread_join(thr[i], NULL); return 0; }