Problema do Banheiro Unissex

Bath control
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.

Comments