[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
Re: Duvidas no EP2
- Subject: Re: Duvidas no EP2
- From: Francisco Reverbel <reverbel at ime.usp.br>
- Date: Wed, 8 May 2002 21:49:46 -0300 (EST)
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