Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MiguelCG88 en 9 Septiembre 2011, 00:32 am



Título: problema CLASICO - Barbero Dormilon
Publicado por: MiguelCG88 en 9 Septiembre 2011, 00:32 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: Alien-Z en 9 Septiembre 2011, 10:35 am
Estoy un poco apretado de tiempo y no puedo leerme el ejercicio detalladamente pero por encima puedo suponer que por ejemplo, si hay 2 peluqueros: atenderán el doble de clientes en el mismo tiempo que lo haría un solo peluquero <||> o atenderán la misma cantidad de clientes en la mitad de tiempo (cualquiera de los dos puntos de vista valen).

Si un peluquero tarda por ejemplo 100 segundos en atender a un cliente, 2 peluqueros tardarán 50 segundos, y 3 peluqueros 33,3. Lo único que debes hacer es dividir el tiempo entre la cantidad de peluqueros que haya trabajando (N).

No sé si es eso a lo que te referías, si no comenta que más tarde lo miro detenidamente y te digo. Saludos.



Título: Re: problema CLASICO - Barbero Dormilon
Publicado por: Valkyr en 9 Septiembre 2011, 11:41 am
Tal y como te dije en el otro post (no hace falta que los dupliques) si puedes poner el enunciado o si no lo tienes explicar más o menos que es lo que hay que hacer quizás te pueda echar una mano. Este año he hecho varias prácticas de programación concurrente así que quizás pueda echarte un cable.

Saludos.


Título: Re: problema CLASICO - Barbero Dormilon
Publicado por: MiguelCG88 en 10 Septiembre 2011, 23:22 pm
El barbero dormilón, Una peluquería tiene un barbero, una silla de peluquero y n sillas para que se sienten los clientes en espera, si es que los hay. Si no hay clientes presentes, el barbero se sienta en su silla de peluquero y se duerme. Cuando llega un cliente, este debe despertar al barbero dormilón. Si llegan más clientes mientras el barbero corta el cabello de un cliente, estos deben esperar sentados (si hay sillas desocupadas) o salirse de la peluquería (si todas las sillas están ocupadas). El problema consiste en programar al barbero y los clientes sin entrar en condición de competencia.

ya hice el programa usando un semaforo para 1 barbero,pero ahora debo hacerlo para "n" barberos.
gracias


Título: Re: problema CLASICO - Barbero Dormilon
Publicado por: MiguelCG88 en 11 Septiembre 2011, 00:21 am
Estoy un poco apretado de tiempo y no puedo leerme el ejercicio detalladamente pero por encima puedo suponer que por ejemplo, si hay 2 peluqueros: atenderán el doble de clientes en el mismo tiempo que lo haría un solo peluquero <||> o atenderán la misma cantidad de clientes en la mitad de tiempo (cualquiera de los dos puntos de vista valen).

Si un peluquero tarda por ejemplo 100 segundos en atender a un cliente, 2 peluqueros tardarán 50 segundos, y 3 peluqueros 33,3. Lo único que debes hacer es dividir el tiempo entre la cantidad de peluqueros que haya trabajando (N).

No sé si es eso a lo que te referías, si no comenta que más tarde lo miro detenidamente y te digo. Saludos.



gracias por la ayuda ,pero en realidad no interesa mucho los tiempos, lo que me interesa es hacer que el programa funcione para N barberos y no solo para uno.
gracias


Título: Re: problema CLASICO - Barbero Dormilon
Publicado por: Valkyr en 11 Septiembre 2011, 00:40 am
El programa creo que no sería demasiado complicado.

Podrías llevar una variable entera con el número de barberos que están libres: barberosLibres = N;

Entonces cuando el cliente llega comprueba esta variable, si es mayor que cero entonces es porque hay un barbero que puede atenderle (si se necesitase saber exactamente qué barbero es el que está libre se podría hacer llevando en un array cada barbero y asociando algún número para indicar si está libre u ocupado). Si por el contrario no hay ningún barbero libre, entonces comprueba si hay alguna silla libre (también se puede llevar con una variable entera) sí hay sillas libres entonces espera, si no se marcha.

Por otro lado los barberos tendrían que comprobar si hay alguna silla ocupada, si la hay atienden a dicho cliente, si no hay sillas ocupadas entonces puede dormir.

Más o menos creo que he detallado todos los casos, o al menos, los más importantes. Ahora es cosa tuya la implementación.

Si me he equivocado o tienes alguna duda, responde ;).

Saludos.