Foro de elhacker.net

Programación => Ejercicios => Mensaje iniciado por: MiguelCG88 en 9 Septiembre 2011, 00:33 am



Título: problema CLASICO - Barbero Dormilon
Publicado por: MiguelCG88 en 9 Septiembre 2011, 00:33 am
hola , estoy haciendo un trabajo para exponer en la universidad,soy principiante ok. tengo que exponer sobre el problema clasico de sincronizacion del barbero dormilon y su solucion con semaforos , ya hice la solucion y funciona, ahora debo hacer que la misma solucion para N barberos ,ya qu en mi solucion solo existe un barbero. Adjunto mi codigo en C, usando JBaci .
gracias de antemano.

espero su ayuda.
explico un poco mi codigo, hace uso de un semaforo y debo hacer que el numero de barberos pueda ser mas d uno , 2, 3,4 ....N. y que siga funcionando.

Código:
semaphore peluqueros=1;     
int cantClientes=0;
int clientesAtendidos=0;
int cantSillas=5;                  //puede ser la cantidad de sillas que deseemos en la barberia
int cantSillasOcupadas=0;
int tiempoDeLlegada=0;
int tiempoDeAtencion=0;

void recorre(int cliente){
int j;
for(j=1;j<=cantSillasOcupadas;j++){
cout<<"el cliente de la silla"<<j+1<<" pasa a la silla " <<j<<endl;
}
}
void peluquero(){
int p;
if(tiempoDeAtencion==0){
if(cantSillasOcupadas>0){
wait(peluqueros);
clientesAtendidos=clientesAtendidos+1;
cantSillasOcupadas=cantSillasOcupadas-1;       
tiempoDeAtencion=random(50);
if(cantClientes==1){
cout<<"+-------------------------------------------------------------------+"<<endl;
cout<<"|                                                                   |"<<endl;
cout<<" el "<<clientesAtendidos<<" º cliente"<<" esta despertando al peluquero"<<endl;
cout<<" el "<<clientesAtendidos<<" º cliente"<<" pasa a ser atendido"<<endl;
cout<<" se esta atendiendo al " <<clientesAtendidos<<" º cliente"<<"\n"<<endl;
cout<<"|                                                                   |"<<endl;
cout<<"+-------------------------------------------------------------------+"<<endl;
}else{
cout<<"+-------------------------------------------------------------------+"<<endl;
cout<<"|                                                                   |"<<endl;
cout<<" el "<<clientesAtendidos<<" º cliente"<<"pasa a ser atendido"<<endl;       
cout<<" se esta atendiendo al " <<clientesAtendidos<<" º cliente"<<"\n"<<endl;
cout<<"|                                                                   |"<<endl;
cout<<"+-------------------------------------------------------------------+"<<endl;
recorre(clientesAtendidos);
    }
signal(peluqueros);
}else{
cout<<"-----------------<PELUQUERO DURMIENDO>-------------------"<<"\n"<<endl;
}
}else{
for(p=0;p<tiempoDeAtencion;p++){
tiempoDeAtencion=tiempoDeAtencion-1;
if(tiempoDeAtencion==0){
cout<<"******************************************************"<<endl;
cout<<"  se termino de atender al "<<clientesAtendidos<<"º cliente"<<endl;
cout<<"******************************************************"<<endl;
peluquero();

}
}
}
}
void ensillar(int cliente){
int k;
if(cantSillasOcupadas<cantSillas){
cantSillasOcupadas=cantSillasOcupadas+1;
cout<<"  el "<<cliente<<" º cliente"<<" se sento en la "<<cantSillasOcupadas<<" º silla"<<endl;
cout<<"|                                             |"<<endl;
cout<<"+--------------------------------------------+"<<endl;
if(cantClientes==1){
peluquero();
}
}else{
cout<<"  el "<<cliente<<" º cliente"<<" se fue "<<endl;
cout<<"|                                             |"<<endl;
cout<<"+--------------------------------------------+"<<endl;
}
}
void llega(int cliente){
int i;
int j;
if(cantSillas>0){
tiempoDeLlegada=random(100);
for(j=0;j<tiempoDeLlegada;j++){}
for(i=1;i<=cliente;i++){
cantClientes=cantClientes+1;
cout<<"+--------------------------------------------+"<<endl;
cout<<"|                                             |"<<endl;
cout<<"  llego el "<<cantClientes<<" º cliente "<<endl;
ensillar(cantClientes);

}
}
}
void main(){
cobegin{
while(1){
peluquero();
llega(1);


}
}
}


Título: Re: problema CLASICO - Barbero Dormilon
Publicado por: Valkyr en 9 Septiembre 2011, 04:20 am
Tienes el enunciado del problema? Así sería mucho más sencillo pensar en algo que pueda ayudarte. Ponlo o si no explicalo con tus propias palabras.

Saludos.