Suponha que em um local público exista apenas um banheiro
com n boxes (um compartimento com um sanitário). O banheiro pode ser usado
tanto por homens e mulheres, mas não ao mesmo tempo.
Faça um algoritmo concorrente baseado em monitor que
controle o uso do banheiro.
A entrada no banheiro é feita pelo procedimento enterBathroom.
Depois de entrar no banheiro com sucesso, use o procedimento getStall, para usar
um box. Se todos os boxes estiverem em uso então eles esperam em uma fila (não
há espaço suficiente no banheiro). Depois de usar o box, cada pessoa avisa para que os outros usuários possam usá-lo.
O programa deve ser justo no seguinte sentido. Suponha que,
em um determinado instante no tempo, o banheiro está em uso por x pessoas de um
mesmo sexo (alguns usando boxes e outros em espera), e a primeira pessoa do
sexo oposto chega, chamada P.
Então:
- P entra no banheiro, logo depois da saída de todos o x indivíduos
do banheiro,
- Enquanto P está esperando, se outros indivíduos do mesmo
sexo chegam, eles usarão o banheiro simultaneamente com P,
- Enquanto P está à espera, se indivíduos do sexo oposto
chegam para usar o banheiro, eles entram no banheiro depois de P (e seus
companheiros do mesmo sexo, se for o caso) saírem do banheiro,
- Enquanto P (e companheiros do mesmo sexo) estão usando o
banheiro, se pessoas do mesmo sexo de P chegar, eles vão esperar todas as
pessoas do sexo oposto de P saírem antes de começar a usar o banheiro.
O trabalho prático consiste em escrever um programa em C,
C++, Java ou Python para simular o controle concorrente do acesso ao banheiro.
Cada pessoa de ambos os sexos deve ser um processo separado. Não existe uma pessoa controlando o acesso ao banheiro, mas todas as pessoas sabem das regras de uso do banheiro e as obedece (ninguém fura
a fila....).
Problema 1:
Considere que o banheiro tem apenas um box (n = 1).
Ao todo, 50 pessoas irão usar o banheiro, com um gerador de números
aleatórios definindo o sexo (com probabilidade igual).
Use um gerador de números aleatórios, de modo que o tempo
entre chegada de pessoas seja entre 1 e 7 segundos.
Cada pessoa usa o banheiro durante exatamente 5 segundos.
Use threads e monitores para sincronização. Você também pode
usar memória compartilhada.
Ao final da execução do programa deve ser exibido um
relatório contendo:
- Quantidade de pessoas de cada sexo.
- Tempo médio de espera para usar o banheiro para cada sexo.
- Taxa de ocupação do box (tempo em uso / tempo total).
Problema 2:
Considere agora que o banheiro tem 3 boxes (n=3) e que o
número total de pessoas é 150.
Problema 3:
Considere agora que o banheiro tem 5 boxes (n=5) e que o
número total de pessoas é 250.