elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problema CLASICO - Barbero Dormilon
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problema CLASICO - Barbero Dormilon  (Leído 16,255 veces)
MiguelCG88

Desconectado Desconectado

Mensajes: 9


Ver Perfil
problema CLASICO - Barbero Dormilon
« 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);


}
}
}


En línea

Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: problema CLASICO - Barbero Dormilon
« Respuesta #1 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.



« Última modificación: 9 Septiembre 2011, 10:37 am por Alien-Z » En línea

Valkyr


Desconectado Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: problema CLASICO - Barbero Dormilon
« Respuesta #2 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.
En línea

MiguelCG88

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: problema CLASICO - Barbero Dormilon
« Respuesta #3 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
En línea

MiguelCG88

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: problema CLASICO - Barbero Dormilon
« Respuesta #4 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
En línea

Valkyr


Desconectado Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: problema CLASICO - Barbero Dormilon
« Respuesta #5 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Prisoner Of Ice Un Clasico!!!
Juegos y Consolas
amirson 3 2,217 Último mensaje 22 Marzo 2005, 08:43 am
por fandango
clasico ....de avi a mpg
Multimedia
SANSARA 2 2,343 Último mensaje 24 Noviembre 2005, 17:20 pm
por el-brujo
Problema clasico (Granjero, Lobo, Cabra, Repollo) !!!! « 1 2 »
Desafíos - Wargames
luka.ghost 13 32,791 Último mensaje 1 Mayo 2011, 00:33 am
por Karen Izaguirre
problema CLASICO - Barbero Dormilon
Ejercicios
MiguelCG88 1 12,302 Último mensaje 9 Septiembre 2011, 04:20 am
por Valkyr
La Cena De Los Filosofos ( Problema Clasico) #Ayuda
Programación C/C++
candycrush 1 3,185 Último mensaje 21 Agosto 2014, 08:00 am
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines