Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
#include "stdio.h" #include "unistd.h" #include "stdlib.h" #include "pthread.h" #include "semaphore.h" #define CHAIRS 5 /* número de cadeiras para os clientes à espera */ #define TRUE 1 sem_t customers; /* número de cliente à espera de atendimento */ sem_t barbers; /* número de barbeiros à espera de clientes */ sem_t mutex; /* para exclusão mútua */ int waiting = 0; /* clientes que estão esperando (não estão cortando) */ /* protótipos */ void* barber(void *arg); void* customer(void *arg); void cut_hair(); void customer_arrived(); void get_haircut(); void giveup_haircut(); int main() { sem_init(&customers, TRUE, 0); sem_init(&barbers, TRUE, 0); sem_init(&mutex, TRUE, 1); pthread_t b, c; /* criando único barbeiro */ pthread_create(&b, NULL, (void *) barber, NULL); /* criação indefinida de clientes */ while(TRUE) { pthread_create(&c, NULL, (void *) customer, NULL); sleep(1); } return 0; } void* barber(void *arg) { while(TRUE) { sem_wait(&customers); /* vai dormir se o número de clientes for 0 */ sem_wait(&mutex); /* obtém acesso a 'waiting' */ waiting = waiting - 1; /*descresce de um o contador de clientes à espera */ sem_post(&barbers); /* um barbeiro está agora pronto para cortar cabelo */ sem_post(&mutex); /* libera 'waiting' */ cut_hair(); /* corta o cabelo (fora da região crítica) */ } pthread_exit(NULL); } void* customer(void *arg) { sem_wait(&mutex); /* entra na região crítica */ if(waiting < CHAIRS) { /* se não houver cadeiras vazias, saia */ customer_arrived(); waiting = waiting + 1; /* incrementa o contador de clientes à espera */ sem_post(&customers); /* acorda o barbeiro se necessário */ sem_post(&mutex); /* libera o acesso a 'waiting' */ sem_wait(&barbers); /* vai dormir se o número de barbeiros livres for 0 */ get_haircut(); /* sentado e sendo servido */ } else { sem_post(&mutex); /* a barbearia está cheia; não espera */ giveup_haircut(); } pthread_exit(NULL); } void cut_hair() { printf("Barbeiro estah cortando o cabelo de alguem!\n"); sleep(3); } void customer_arrived() { printf("Cliente chegou para cortar cabelo!\n"); } void get_haircut() { printf("Cliente estah tendo o cabelo cortado!\n"); } void giveup_haircut() { printf("Cliente desistiu! (O salao estah muito cheio!)\n"); } //////codigo do barbeiro////////////// #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 dos N filosofos void mostrar(){ for(i=1; i<=N; i++){ if(state[i-1] == THINKING){ printf("O filosofo %d esta pensando!\n", i); } if(state[i-1] == HUNGRY){ printf("O filosofo %d esta com fome!\n", i); } if(state[i-1] == EATING){ printf("O filosofo %d esta comendo!\n", i); } } printf("\n"); } //acao do filosofo void *acao_filosofo(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 o filosofo pode comer void test(int i){ if(state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING){ state[i]=EATING; mostrar(); sem_post(&sem_fil[i]); } } //a thread(filosofo) espera um tempo aleatoria pensando ou comendo void pensar(int i){ float_rand=0.001*random(); int_rand=float_rand; usleep(int_rand); } void comer(int i){ float_rand=0.001*random(); int_rand=float_rand; usleep(int_rand); } void main(){ for(i=0;i<N; i++){ state[i]=0; } mostrar(); int res; pthread_t thread[N]; void *thread_result; //inicia os semaforos res = sem_init(&mutex,0,1); if(res!=0){ perror("Erro na inicialização do semaforo!"); exit(EXIT_FAILURE); } for(i=0; i<N; i++){ res = sem_init(&sem_fil[i],0,0); if(res!=0){ perror("Erro na inicialização do semaforo!"); exit(EXIT_FAILURE); } } //cria as threads(filosofos) for(i=0; i<N; i++){ res = pthread_create(&thread[i],NULL,acao_filosofo,&i); if(res!=0){ perror("Erro na inicialização da thread!"); exit(EXIT_FAILURE); } } //faz um join nas threads for(i=0; i<N; i++){ res = pthread_join(thread[i],&thread_result); if(res!=0){ perror("Erro ao fazer join nas threads!"); exit(EXIT_FAILURE); } } } //////////////qcodigo do jantar///////////
Compartilhar