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

Re: Duvidas no EP2



On Wed, 8 May 2002, Jay Santos wrote:

> No segundo problema, tinha esquecido duas coisas:
> 
> 1) esqueci de dar um pthread_detach apos criar a
> thread carro.

Porque chamar pthread_detach? Me parece que isso não vai fazer 
nenhuma diferença aqui.

> 2) demorei pra perceber que o pthread_cond_timewait,
> quando acaba o tempo de espera, pega o lock do mutex
> de novo automaticamente, mas nao o libera!

Isso é verdade. Em outra mensagem eu tinha dado uma "receita de uso" 
do pthread_cond_timewait que não deixava isso muito claro:

: Definam uma condition variable dummy, que _nunca_ sera' sinalizada,
: e um mutex _por_thread_ que precisar de um "thread sleep":
: 
:     pthread_cont_t dummy = PTHREAD_COND_INITIALIZER; 
:     pthread_mutex_t mutex_da_thread = PTHREAD_MUTEX_INITIALIZER;
: 
: Quando quiser que uma thread durma, preencha uma struc timespec tempo
: com o tempo ate' ela acordar e diga:
: 
:     pthread_mutex_lock(&mutex_da_thread);
:     pthread_cond_timedwait(&dummy, &mutex_da_thread, &tempo);
      pthread_mutex_unlock(&mutex_da_thread); // faltou isto na receita!

O pthread_cond_timedwait() quer recever um mutex travado. Ele libera 
o mutex antes de entrar no estado de espera e re-trava o mutex antes 
de retornar. Ou você destrava o mutex antes da próxima chamada a 
pthread_mutex_lock() sobre esse mutex (foi o que fiz acima, no retorno
do pthread_cond_timedwait()), ou nem tenta travá-lo de novo (pois ele
já está travado). Esclarecendo a segunda alternativa:

    // faz isso uma vez só, na inicialização:
    pthread_mutex_lock(&mutex_da_thread); 

    ...

    // quando quiser esperar, faz só isso:
    pthread_cond_timedwait(&dummy, &mutex_da_thread, &tempo);

Quem estiver achando esquisito o funcionamento das funções 
pthread_cond_timedwait() e do pthread_cond_wait(), pense que elas 
servem para se implementar variáveis de condição de um monitor. 
O mutex que elas recebem é o mutex de acesso ao monitor. Chamadas a 
pthread_cond_wait() e pthread_cond_timedwait() só ocorrem de dentro 
do monitor (e portanto com o mutex travado) e deixam o mutex 
destravado _só_enquanto_o_processo_espera_, para que outros processos 
tenham a chance de entrar no monitor e tornar a condição verdadeira.

O uso de pthread_cond_timedwait() no EP2 é meio estranho mesmo, pois
nós (ainda) não estamos usando monitores. No EP2 nós chamamos essa 
função só para fazer uma thread dormir por um certo tempo.

Reverbel