Ayuda con el problema del barbero dormilón

Paula Martínez
31 de Enero del 2011
Ayuda con el programa barbero dormilón
Hola!

Estoy trabajando en este programa y tengo un problema, quiero poner un semáforo para que "Client ha sigut ates" se imprima antes que "Barber descansant" y si hago esto se queda colgado al hacer ^c, llevo tiempo con estoy y me estoy volviendo loca! Si alguien le apetece echar un vistazo...lo agradecería.



#include
#include
#include
#include
#include
#include

#define VERSIO "1.4"

#define SILLONS 1
#define CADIRES 3
#define MAX_CLIENTS (SILLONS+CADIRES)
#define MAX_GEN_CLI (MAX_CLIENTS+1)

#define T_B 1000
#define F_MAX_SER 7
#define F_MAX_GEN 5
#define F_GEN 3

#define T_MIN_GEN F_GEN*50*T_B
#define T_MAX_GEN F_MAX_GEN*T_MIN_GEN
#define T_MIN_SER 50*T_B
#define T_MAX_SER F_MAX_SER*T_MIN_SER


pthread_t generador_clients[MAX_GEN_CLI];//pa que no es penje el programa per falta de memoria

sem_t s_mutex, s_cadires, s_barber, s_servei, s_servit, s_sillo;

int clients_contador= 0; //donem un numero als fils
int cadires= 0;
int sillo= 0; //per a saber si el sillo esta ocupat
int cli_no_at= 0;
int cli_at= 0;
int becades= 0;
int cli_gen= 0; //clients reals
int sillo_act= 0; //-1 barber, 0 buit, id client
int esta_obert= 0;
int exitus= 0; //eixida que causa la mort

/*SENYALS*/
sigset_t sigset, sigint;
struct sigaction act;


void estadistiques () {
printf("S=%d C=%d G=%d A=%d N=%d B=%dn"
,sillo_act, cadires, cli_gen, cli_at, cli_no_at,becades);
}

long alea (long min, long max) {
return(min+1.*(max-min+1)*random()/(RAND_MAX+1.0));
}

void * barber (void * identificacio) {
sem_wait(&s_mutex); //agafar mutex
while (cadires > 0 || esta_obert) {
if (cadires == 0) {
sem_post(&s_mutex); //soltar mutex
becades++;
sillo_act= -1;
fprintf(stdout,"*Barber descansant: ");estadistiques();
sem_wait(&s_barber); //agafar semafor barber
sillo_act= 0;
fprintf(stdout,"*Barber despertat!");estadistiques();
sem_wait(&s_mutex); //agafar mutex
}
sem_post(&s_mutex);//soltar mutex
if (exitus) break; // si esta tancat surt del while per a acabar el fil
sem_post(&s_sillo); //soltar semafor sillo
sem_wait(&s_servei); //agafar semafor servei
usleep(alea(T_MIN_SER,T_MAX_SER));
fprintf(stdout,"*Barber tallant monyo ");estadistiques();
sem_post(&s_servit); //soltar semafor servit
sem_wait(&s_barber);
sem_wait(&s_mutex); //agafar mutex
}
sem_post(&s_mutex); //soltar mutex
pthread_exit(0);
}

void ser_ates (int id) {
sem_post(&s_mutex); //soltar mutex
sem_wait(&s_sillo); //agafar semafor sillo
sem_wait(&s_mutex); //agafar mutex

sillo_act= id;
sillo++;
sem_post(&s_servei); //soltar semafor servei
sem_post(&s_mutex); //soltar mutex
fprintf(stdout,"Client [%d] tallant-se el monyo: ", id);estadistiques();
sem_wait(&s_servit); //agafar semafor servit
sem_wait(&s_mutex); //agafar mutex
cli_at++;
sillo--;
sillo_act= 0;
fprintf(stdout,"Client [%d] ha sigut ates: ", id);estadistiques();
sem_post(&s_barber);
if (cadires > 0){
fprintf(stdout,"Client [%d] ha cridat a un altre client ", id);estadistiques();
sem_post(&s_cadires); //soltar semafor cadires
fprintf(stdout,"-> Client [%d] ha eixit de la barberia: ", id);estadistiques();
}
}

void despertar_barber (int id) {
fprintf(stdout, "Client [%d] desperta a barber ", id);estadistiques();
sem_post(&s_barber); //soltar semafor barber
ser_ates(id);
}

void a_cadires (int id) {
cadires++;
fprintf(stdout, "Client [%d] espera en cadires: ", id);estadistiques();
sem_post(&s_mutex); //soltar mutex
sem_wait(&s_cadires); //agafar semafor cadires
sem_wait(&s_mutex); //agafar mutex
cadires--;
ser_ates(id);
}

void surt_sense_ser_ates (int id) {
cli_no_at++;
fprintf(stdout, "-> Client [%d] surt sense ser ates: ", id);estadistiques();
sem_post(&s_mutex); //soltar mutex
}

void * client (void * identificacio) {
int *passthrough= (int *) identificacio;
int id= *passthrough;
/*fprintf(stderr, "%dn", id);*/
sem_wait(&s_mutex); //agafar mutex
cli_gen++;
fprintf(stdout, "