08.02.2015 Views

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

notas de aula - Jerônimo C. Pellegrini<br />

Enquanto não há requisições disponíveis, este algoritmo permanecerá iterando e<br />

verificando se o buffer está vazio ou não, e desta forma consumirá tempo de processamento<br />

que poderia ser usado por outros processos. Idealmente, esta thread deveria ser bloqueada<br />

quando o buffer estivesse vazio e acordada novamente somente quando houver requisições<br />

no buffer.<br />

Variáveis de condição permitem bloquear threads at que alguma condição seja satisfeita<br />

– por exemplo, que um buffer não esteja vazio, ou que uma requisição seja feita.<br />

Uma thread pode esperar por uma variável de condição; quando o fizer, será bloqueada<br />

até que outra thread sinalize a variável.<br />

O servidor inicia obtendo o mutex mutex_buffer_nao_vazio, e em seguida esperando<br />

que a variável de condição associada a este mutex seja sinalizada. Se o servidor precisar<br />

chamar wait, o mutex será automaticamente liberado quando esta thread for bloqueada.<br />

Quando a thread do servidor for desbloqueada, ela automaticamente readquirirá o mutex.<br />

Função servidor<br />

repita sempre<br />

lock mutex_buffer_nao_vazio<br />

enquanto não buffer_nao_vazio faça<br />

wait condvar_buffer_nao_vazio<br />

r ← desenfilera buffer<br />

trata r<br />

se não há mais requisições então<br />

buffer_nao_vazio ← F<br />

unlock mutex_buffer_nao_vazio<br />

As threads que produzem requisições e as enfilearm no buffer sinalizam a variável<br />

buffer_nao_vazio para que alguma thread consumidora possa processar a requisição.<br />

Função cliente<br />

lock mutex_buffer_nao_vazio<br />

enfilera buffer req<br />

buffer_nao_vazio ← V<br />

sinaliza buffer_nao_vazio<br />

unlock mutex_buffer_nao_vazio<br />

Versão Preliminar<br />

Em <strong>Scheme</strong> usaremos variáveis de condição <strong>com</strong>o definidas na SRFI-18.<br />

[ 27 de outubro de 2010 at 15:47 ]<br />

241

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!