Vous êtes sur la page 1sur 4

Solucin al problema de los baos pblicos

en Sistemas operativos

Problema: Una oficina tiene en su quinta planta un nico lavabo que es unisex.

Para el funcionamiento correcto de este lavabo los empleados han de cumplir las sigui
entes reglas:

En el lavabo no puede haber hombres y mujeres a la vez.


La capacidad mxima es de 3 personas

Escribe el pseudocdigo de los procesos Hombre() y Mujer() para que se garanticen es


tas

dos condiciones en el acceso al lavabo mediante semforos.

El main del programa seria el siguiente:

/** Se definen las CONSTANTES GLOBALES **/

#define AFORO 3

#define WOMEN 5

#define MEN 6

/** Se definen los SEMAFOROS **/

BATHROOM // Controla las variables que dan acceso al lavabo

menSemaphore // Controla el acceso de los hombres

womenSemaphore // Controla el acceso de las mujeres

colaSemaphore // Controla el acceso a bathroomUsers

/** Se definen las VARIABLES GLOBALES **/

int bathroomUsers = 0; // Personas que hay dentro del bao

void main()

int i;
Init(BATHROOM, AFORO);

Init(menSemaphore, 1);

Init(womanSemaphore, 1);

Init(colaSemaphore, 1);

for (i = 0 ; i < WOMEN ; i++)

Pthread_create(women()); //Creamos a una mujer

for (i = 0 ; i < MEN ; i++)

Pthread_create(men()); //Creamos a un hombre

for(i = 0; i < WOMEN; i++) pthread_join(women()) //Espera a todas las


mujeres

for(i = 0; i < MEN; i++) pthread_join(men()); //Espera a todas las


mujeres

La funcin Hombre (en nuestro programa men()), seria como sigue:

void * men(void * id)

wait(colaSemaphore);

wait(menSemaphore);

bathroomUsers++;

if( bathroomUsers == 1 ) //Soy el nico hombre en el bao

wait(womanSemaphore);
}

signal(menSemaphore);

signal(colaSemaphore);

wait(BATHROOM); //Entrada a la seccin critica

//SC

signal(BATHROOM); //Salida de la seccin critica

wait(colaSemaphore);

wait(menSemaphore);

bathroomUsers--;

if (bathroomUsers == 0)

signal(womanSemaphore);

signal(menSemaphore);

signal(colaSemaphore);

pthread_exit(void);

Para la mujer (prcticamente igual que antes):

void * women(void * id)

wait(colaSemaphore);

wait(womanSemaphore); //Bloqueo para mujeres, cuando no les toca.

bathroomUsers++;

if(bathroomUsers == 1 ) //Soy la nica mujer en el bao

{
wait(menSemaphore); //Bloqueo para hombres, cuando no les toca

signal(womanSemaphore);

signal(colaSemaphore);

wait(BATHROOM); //Entrada a la SC

// SC

signal(BATHROOM); // Salida de la SC

wait(colaSemaphore);

wait(womanSemaphore);

bathroomUsers--;

if (bathroomUsers == 0)

signal(menSemaphore);

signal(womanSemaphore);

signal(colaSemaphore);

pthread_exit(void);