#include #include #include #include #define N 5 #define TMAX 10000000000 /* 10s no máximo para comer e 10s no máximo para pensar */ pthread_mutex_t forkV[N]; void * filosofoF (void * i) { struct timespec ts; int * eu = (int *) i; fprintf(stderr,"Sou o Filosofo %d\n",*eu); if (*eu != N-1) while (1) { pthread_mutex_lock(&forkV[*eu]); fprintf(stderr,"Pegou garfo %d: Filosofo %d\n", *eu, *eu); pthread_mutex_lock(&forkV[(*eu+1)%N]); fprintf(stderr,"Pegou garfo %d: Filosofo %d\n", (*eu+1)%N, *eu); /* Come */ fprintf(stderr,"Comendo: Filosofo %d\n", *eu); ts.tv_sec=0; ts.tv_nsec=TMAX*random()/RAND_MAX; nanosleep(&ts,NULL); fprintf(stderr,"Devolveu garfo %d: Filosofo %d\n", *eu, *eu); pthread_mutex_unlock(&forkV[*eu]); fprintf(stderr,"Devolveu garfo %d: Filosofo %d\n", (*eu+1)%N, *eu); pthread_mutex_unlock(&forkV[(*eu+1)%N]); /* Pensando */ fprintf(stderr,"Pensando: Filosofo %d\n", *eu); ts.tv_sec=0; ts.tv_nsec=TMAX*random()/RAND_MAX; nanosleep(&ts,NULL); } else /* Mudando a ordem para o último filósofo */ while (1) { pthread_mutex_lock(&forkV[(*eu+1)%N]); fprintf(stderr,"Pegou garfo %d: Filosofo %d\n", (*eu+1)%N, *eu); pthread_mutex_lock(&forkV[*eu]); fprintf(stderr,"Pegou garfo %d: Filosofo %d\n", *eu, *eu); /* Come */ fprintf(stderr,"Comendo: Filosofo %d\n", *eu); ts.tv_sec=0; ts.tv_nsec=TMAX*random()/RAND_MAX; nanosleep(&ts,NULL); fprintf(stderr,"Devolveu garfo %d: Filosofo %d\n", (*eu+1)%N, *eu); pthread_mutex_unlock(&forkV[(*eu+1)%N]); fprintf(stderr,"Devolveu garfo %d: Filosofo %d\n", *eu, *eu); pthread_mutex_unlock(&forkV[*eu]); /* Pensando */ fprintf(stderr,"Pensando: Filosofo %d\n", *eu); ts.tv_sec=0; ts.tv_nsec=TMAX*random()/RAND_MAX; nanosleep(&ts,NULL); } return NULL; } int main() { int i,ids[N]; pthread_t filosofoT[N]; for (i=0;i