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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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

Usaremos dois semáforos: um para controlar o acesso ao buffer e outro para indicar o<br />

número de itens disponíveis:<br />

mutex ← Semaphore(1)<br />

itens ← Semaphore(0)<br />

O produtor espera até que o buffer esteja disponível, inclui um item, libera o buffer e<br />

finalmente sinaliza que há mais um item disponível:<br />

Função produtor <strong>com</strong> sincronização<br />

repita sempre<br />

e ← gera_evento<br />

wait mutex<br />

add buffer, (e)<br />

signal mutex<br />

signal itens<br />

O consumidor espera até que haja itens no buffer e decrementa o contador de itens,<br />

adquire acesso exclusivo ao buffer e retira um item.<br />

Função consumidor <strong>com</strong> sincronização<br />

repita sempre<br />

wait itens<br />

wait mutex<br />

e ← retira buffer<br />

signal mutex<br />

processa e<br />

11.3.3 Exemplo: lightswitch<br />

Quando uma estrutura pode ser lida por várias threads mas modificada por apenas uma,<br />

pode-se usar um lightswitch (interruptor de luz), que é um padrão de uso de semáforos.<br />

Faremos uma analogia <strong>com</strong> uma sala onde as threads entram: quando a primeira leitora<br />

entra, ela liga a luz. Quando a última leitora sai, ela apaga a luz. A escritora só entrará na<br />

Versão Preliminar<br />

sala quando a luz estiver apagada.<br />

Um semáforo será inicializado <strong>com</strong> zero. A primeira thread leitora bloqueia o acesso<br />

da thread escritora; um contador é usado para lembrar quantas threads leitoras estão<br />

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

247

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

Saved successfully!

Ooh no, something went wrong!