Estoy escribiendo un programa (para la tarea) que simula un baño unisex. Solo se permiten 4 personas a la vez y los hombres y las mujeres no pueden ingresar si el otro sexo ya está usando el baño. Mi problema es permitir un máximo de 4 personas en el baño. Como puede ver en la salida, solo 1 persona ingresa al baño a la vez. Aquí está mi código:exclusión mutua y semáforos
const int Delayx = 60;
int i;
int restroom = 0;
int Menwaiting = 0;
int Womenwaiting = 0;
semaphore max_capacity;
semaphore woman;
semaphore man;
semaphore mutex;
semaphore restroomcount;
void Delay(void)
{
int DelayTime;
DelayTime = random(Delayx);
for (i = 0; i<DelayTime; i++);
}
void Woman(void)
{
// for(;;){
Womenwaiting++;
//wait(mutex);
wait(woman);
wait(max_capacity);
//wait(woman);
wait(mutex);
wait(restroomcount);
cout << "A Woman has entered Restroom"<<endl;
cout << "People in the Restroom:" << restroom++ <<endl <<endl;
signal(restroomcount);
Womenwaiting--;
Delay();
wait(restroomcount);
cout << "A woman has exited Restroom"<<endl;
cout << "People in the Restroom:" << restroom-- <<endl<<endl;
signal(restroomcount);
signal(mutex);
signal(max_capacity);
if(Menwaiting > Womenwaiting){
signal(man);
}
else{
signal(woman);
}
//signal(max_capacity);
//signal(man);
// }
}
void Man(void)
{
// for(;;){
Menwaiting++;
//wait(mutex);
wait(man);
wait(max_capacity);
//wait(man);
wait(mutex);
wait(restroomcount);
cout <<"A Man has entered the Restroom"<<endl;
cout <<"People in the Restroom:" << restroom++ <<endl<<endl;
signal(restroomcount);
Menwaiting--;
//signal(mutex);
Delay();
//wait(mutex);
wait(restroomcount);
cout << "A man has exited the Restroom"<<endl;
cout <<"People in the Restroom:" << restroom-- <<endl<<endl;
signal(restroomcount);
signal(mutex);
signal(max_capacity);
if(Womenwaiting > Menwaiting){
signal(woman);
}
else{
signal(man);
}
//signal(max_capacity);
//signal(woman);
//}
}
void main()
{
initialsem(woman,1);
initialsem(man,1);
initialsem(max_capacity,4);
initialsem(mutex,1);
initialsem(restroomcount,1);
cobegin
{
Woman(); Woman(); Woman(); Woman(); Woman(); Man(); Man(); Man(); Man(); Man();
}
}
Esto genera el siguiente resultado:
Un hombre ha entrado en el lavabo
Personas en el baño: 1Un hombre ha salido del lavabo
Personas en el baño: 0Un hombre ha entrado en el baño
La gente en el baño: 1Un hombre ha salido del lavabo
Personas en el baño: 0una mujer ha entrado Baño
Personas en el baño: 1Una mujer ha salido baño
la gente en el baño: 0una mujer ha entrado en el baño
la gente en el baño: 1Una mujer ha salido de baños
Personas en el baño: 0
Y así sucesivamente, para siempre.
¿Qué parte de este código se supone que es responsable de la prevención de una el hombre entra al baño, si ya hay una mujer allí, y viceversa? –
¿Se supone que esta asignación es de un solo hilo? usar hilos? corutinas? – dgnorton
No lo entiendo: si hombres y mujeres no pueden entrar a la misma habitación al mismo tiempo, ¿cómo se supone que deben hacer el amor? – ereOn