[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
Re: Duvida especifica no EP2
- Subject: Re: Duvida especifica no EP2
- From: Francisco Reverbel <reverbel at ime.usp.br>
- Date: Tue, 8 May 2001 17:02:23 -0300 (BRST)
Oi Tiago,
Sim, você pode fazer a função próximo cliente retornar um ClientePtr ou
receber um BarbeiroPtr, como preferir. Agora que você me fez pensar nisso,
me parece que o melhor seria fazer essas duas funções receberem um
identificador do barbeiro:
monitor Barbearia {
// os campos que voce precisar:
...
// operação chamada pelos clientes:
boolean cortaCabelo() { ... }
// operações chamadas pelos barbeiros:
void proximoCliente(int iBarbeiro) { ... }
void corteTerminado(int iBarbeiro) { ... }
}
Vou tentar explicar melhor o que pensei: pode ser bom que o monitor tenha
campos vetoriais, com uma posição para cada barbeiro. Algo como
boolean cadeiraOcupada[N]; // cadeiraOcupada[i] indicaria
// se a cadeira do i-esimo barbeiro
// está ocupada ou não
Se você tiver vetores assim, com cada barbeiro só olhando/mexendo na sua
posição do vetor, então é bom passar um número do barbeiro nas chamadas a
proximoCliente() e corteTerminado(). E é bom que esse número seja um
"inteiro pequeno", que sirva como índice para acessar a posição do
barbeiro nos vetores que você tiver. (Infelizmente os thread ids
retornados por pthread_self() não servem, pois não são "inteiros
pequenos" alocados a partir de zero.)
É mesmo necessário o argumento adicional iBarbeiro?
Nao. Dá para se virar sem ele, com muito pouco trabalho adicional.
Como cada barbeiro é uma thread, ele tem um thread id, que pode ser obtido
a qualquer momento chamando pthread_self(). Então você pode considerar
que todas as chamadas ao monitor tem um argumento implícito, que é o
thread id. Assim, o monitor pode fazer o mapeamento entre o thread id e o
indice do barbeiro que ele (monitor) usa internamente para acessar seus
campos vetoriais. Para isso o monitor poderia usar uma tabela de hash. O
índice do barbeiro seria alocado na primeira vez que uma "thread barbeiro"
chamasse a função proximoCliente(). Nessa ocasião seria inserida na tabela
de hash uma entrada associando o id da thread ao índice do barbeiro. As
chamadas subsequentes ao monitor por essa thread efetuariam buscas na
tabela de hash, usando o id da thread como chave para obter o índice do
barbeiro.
Precisa mesmo fazer isso neste EP?
Não. Um argumento adicional como o iBarbeiro é aceitável.
Para variar acho que falei demais... Espero que não tenha dito nenhuma
bobagem muito grande!
Reverbel
On Mon, 7 May 2001, Tiago wrote:
> No módulo da Barbearia temos duas funções para os barbeiros:
>
> void ProximoCliente() {...}
> void CorteTerminado() {...}
>
> As duas estão declaradas sem parâmetros nem retorno. Que tipo de comunicação com
> o barbeiro será possível?? Posso colocar um parâmetro na função, ou o objetivo é
> apenas dar wait? Eu preferia fazer assim:
>
> ClientePtr ProximoCliente() {...}
>
> mas
>
> void ProximoCliente(BarbeiroPtr) {...}
>
> também me serve.
>
> []s, Tiago.
>
>