[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: Duvida especifica no EP2



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