Problema do Banheiro Unisex com Três Gêneros

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, mulheres e outros gêneros, mas não ao mesmo tempo. Apesar de reconhecer a variedade de gêneros existentes possíveis, neste problema vamos considerar apenas 3 (três).

Faça a implementação com um algoritmo concorrente que controle o uso do banheiro.

A entrada no banheiro é feita pelo procedimento enterRestroom. 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 fora (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 sentido de dividir justamente o tempo do banheiro de forma que todos os gêneros esperem um tempo semelhante.. 

Regras

Suponha que, em um determinado instante, o banheiro está em uso por x pessoas de um determinado gênero (alguns usando boxes e outros em espera), e a primeira pessoa de gênero diferente chega, chamada P.

Então:

  • P entra no banheiro, logo depois da saída de todos o x indivíduos que estavam no banheiro,
  • Enquanto P está no banheiro, se outros indivíduos do mesmo gênero chegam, eles usarão o banheiro simultaneamente com P até ocupar todos os n boxes,
  • Enquanto P está em espera fora do banheiro esperando uma vaga, se indivíduos de gênero diferente chegar para usar o banheiro, este vai entrar no banheiro logo depois de P (e seus companheiros do mesmo gênero que estavam no banheiro anteriormente, se for o caso) saírem do banheiro,
  • Enquanto P (e companheiros do mesmo gênero) estão usando o banheiro, se pessoas do mesmo gênero de P chega e houver pessoas de gênero diferente esperando, P vai esperar todas as pessoas do gênero diferente de P saírem antes de começar a usar o banheiro.
  • Caso haja duas filas P e P' em espera fora do banheiro pela vaga, será atendido inicialmente P do gênero a mais tempo na fila de espera, permitindo a entrada de todos os Ps do mesmo gênero que chegaram antes de P'.  

Escreva um programa em C, C++, Java ou Python para simular o controle concorrente do acesso ao banheiro.

Cada pessoa 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....) e  sabem qual o gênero está usando no instante.

Problema 1:

Considere que o banheiro tem apenas um box (n = 1).

Ao todo, 60 pessoas irão usar o banheiro, com um gerador de números aleatórios definindo o gênero (com probabilidade igual). Use um contador para gerar exatamente 20 pessoas de cada gênero

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 algum mecanismo para sincronização. Você pode usar memória compartilhada.

Ao final da execução do programa deve ser exibido um relatório contendo:

  • Quantidade de pessoas de cada gênero.
  • Tempo médio de espera para usar o banheiro para cada gènero.
  • Taxa de ocupação do box (tempo em uso / tempo total).

Problema 2:

Considere agora que o banheiro tenha 3 boxes (n=3) e que o número total de pessoas é 150.

Problema 3:

Considere agora que o banheiro tenha 5 boxes (n=5) e que o número total de pessoas é 300.

Comments