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

11.3.7 Mais sobre semáforos<br />

Semáforos são pouco usados em aplicações concorrentes, mas muito usados em núcleos<br />

de sistemas operacionais e outros programas concorrentes de baixo nível. Uma excelente<br />

exposição de muitos padrões de uso de semáforos (tanto os mais <strong>com</strong>uns <strong>com</strong>o diversos<br />

usos menos conhecidos) é o livro de Allen Downey, “The Little Book of Semaphores” [38].<br />

O livro de Gregory Andrews [40] também aborda o uso e implementação de semáforos.<br />

11.4 barreiras<br />

Pode ser necessário que várias threads façam um único rendezvous em um certo momento<br />

– nenhuma thread pode passar de um certo ponto no código até que todas tenham chegado.<br />

A isso chamamos de barreira.<br />

Podemos usar barreiras para implementar, por exemplo, programas que precisam<br />

atualizar objetos em uma tela – diferentes threads trabalham em diferentes objetos, e<br />

somente após todas chegarem a uma barreira cada uma delas desenha seu objeto.<br />

Há diferentes maneiras de implementar barreiras; mostraremos aqui <strong>com</strong>o implementálas<br />

usando semáforos. Podemos usar um contador de threads que já tenham chegado à<br />

barreira; um mutex lock m para controlar o acesso ao contador; e um semáforo “barreira”,<br />

que inicia <strong>com</strong> zero e somente receberá um signal quando a última thread chegar à<br />

barreira:<br />

contador ← 0<br />

m ← semaforo 1<br />

barreira ← semaforo 0<br />

Versão Preliminar<br />

252<br />

[ 27 de outubro de 2010 at 15:47 ]

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

Saved successfully!

Ooh no, something went wrong!