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

Jerônimo C. Pellegrini<br />

( let (( msg ( dequeue ! messages )))<br />

( mutex-unlock ! messages-lock )<br />

msg ))))))<br />

A implementação de send! é bastante simples. Após enfileirar a mensagem, sinaliza<br />

a variável de condição.<br />

( define send !<br />

( lambda ( msg )<br />

( mutex-lock ! messages-lock )<br />

( enqueue ! msg messages )<br />

( condition-variable-signal ! messages-available )<br />

( mutex-unlock ! messages-lock )))<br />

Primeiro testamos nossa mailbox <strong>com</strong> uma única thread. Criamos uma mailbox m e<br />

enviamos três mensagens:<br />

(define m (make-mailbox))<br />

(mailbox-send! m 1)<br />

(mailbox-send! m 20)<br />

(mailbox-send! m 300))<br />

Tentamos então receber as três mensagens.<br />

(mailbox-receive! m)<br />

1<br />

(mailbox-receive! m)<br />

20<br />

(mailbox-receive! m)<br />

300<br />

Versão Preliminar<br />

Se tentássemos receber mais uma mensagem, a única thread ativa (que está executando<br />

o REPL) ficaria bloqueada aguardando que alguém sinalizasse a variável<br />

messages-available – mas isso nunca acontecerá, porque não há outra thread que<br />

possa fazê-lo.<br />

Agora realizamos um pequeno teste <strong>com</strong> duas threads. Uma thread enviará três<br />

mensagens, <strong>com</strong> um intervalo de três segundos entre a segunda e a terceira; a outra<br />

receberá e mostrará as mensagens.<br />

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

271

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

Saved successfully!

Ooh no, something went wrong!