Buscar

codigos jantar dos filosofos e barbeiro preguiçoso

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///////////

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando