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

Quando uma thread chama signal, o contador interno do semáforo é incrementado<br />

de uma unidade.<br />

Quando uma thread chama wait, o contador é verificado. Se este for igual a zero, a<br />

thread deverá dormir até que o contador seja maior que zero. Se o contador for maior<br />

que zero, ele é diminuído e a thread ganha acesso ao recurso <strong>com</strong>partilhado.<br />

Função wait(sem)<br />

se sem.contador > 0 então<br />

sem.contador ← sem.contador −1;<br />

senão<br />

sem.fila.add esta_thread;<br />

Função signal(sem)<br />

se sem.fila está vazia então<br />

sem.contador ← sem.contador +1;<br />

senão<br />

yield (proximo sem.fila);<br />

Semáforos podem ser implementados <strong>com</strong>o bibliotecas, <strong>com</strong>o parte de linguagens<br />

de programação ou <strong>com</strong>o funções internas de um sistema operacional (os sitemas operacionais<br />

do tipo Unix implementam semáforos e expõem sua API para usuários, por<br />

exemplo).<br />

O nível de abstração dos semáforos é relativamente baixo, exigindo que o programador<br />

se lembre de liberar todos os semáforos que adquirir, e garanta que cada thread adquirirá<br />

e liberará semáforos de forma ordenada a fim de evitar deadlocks. Há idéias de nível de<br />

abstração conceitual mais alto, <strong>com</strong>o monitores e memória transacional, que liberam o<br />

programador de parte destes problemas. A linguagem Java, por exemplo, permite declarar<br />

que o acesso a certos <strong>com</strong>ponentes do programa deve ser sincronizado; este mecanismo é<br />

implementado internamente <strong>com</strong> semáforos.<br />

11.3.1 Exemplo de uso: rendezvous<br />

Versão Preliminar<br />

Um algoritmo concorrente exige que duas threads A e B se encontrem (façam um rendezvous):<br />

há um ponto no algoritmo de A e outro no algoritmo de B até onde ambas devem<br />

chegar, para só então poder continua executando. Por exemplo um jogo de ação pode<br />

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

245

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

Saved successfully!

Ooh no, something went wrong!