Escolar Documentos
Profissional Documentos
Cultura Documentos
#include
#include
#include
#include
#include
#include
#define
#define
#define
#define
#define
#define
void
void
void
void
<stdio.h>
<stdlib.h>
<semaphore.h>
<pthread.h>
<unistd.h>
<windows.h>
<time.h>
N 5
PENSAR 0
FOME 1
COMER 2
ESQUERDA (nfilosofo+4)%N //agarrar hashi da esquerda
DIREITA (nfilosofo+1)%N //agarrar hashi da direita
*filosofo(void *num);
agarraHashi(int);
deixaHashi(int);
testar(int);
sem_wait(&mutex);
estado[nfilosofo]=PENSAR;
printf("Filosofo %d deixou os Hashis %d(direita) e %d(esquerda).\n",nfil
osofo+1,ESQUERDA+1,nfilosofo+1);
printf("Filosofo %d esta pensando.\n",nfilosofo+1);
testar(ESQUERDA);
testar(DIREITA);
sem_post(&mutex);
}
void testar(int nfilosofo){
if(estado[nfilosofo]==FOME && estado[ESQUERDA]
!=COMER && estado[DIREITA]!=COMER){
estado[nfilosofo]=COMER;
sleep(2);
printf("Filosofo %d agarrou os Hashis %d(direita) e %d.(esquerda
)\n",nfilosofo+1,ESQUERDA+1,nfilosofo+1);
printf("Filosofo %d esta comendo.\n",nfilosofo+1);
sem_post(&S[nfilosofo]);
}
}
int main(){
int i;
pthread_t thread_id[N]; //identificadores das threads
sem_init(&mutex,0,1);
for(i=0;i<N;i++)
sem_init(&S[i],0,0);
for(i=0;i<N;i++){
pthread_create(&thread_id[i],NULL,filosofo,&nfilosofo[i]);
//criar as threads
printf("Filosofo %d esta a pensar.\n",i+1);
}
for(i=0;i<N;i++)
pthread_join(thread_id[i],NULL);
//fazer a juno das threads
return(0);
}