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

Jerônimo C. Pellegrini<br />

Nossa implementação de mailbox é bastante simples, sem preocupação <strong>com</strong> eficiência,<br />

porque sua função é ajudar a <strong>com</strong>preender o mecanismo.<br />

Implementamos uma mailbox usando nossa implementação de fila, que ficará em<br />

um fecho junto <strong>com</strong> um mutex e uma variável de condição. Usaremos um único mutex,<br />

portanto somente uma operação poderá ser realizada em uma mailbox de cada vez.<br />

( load " queues . scm ")<br />

( define make-mailbox<br />

( lambda ()<br />

( let (( messages ( make-q ))<br />

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

( messages-available ( make-condition-variable )))<br />

( define send ! ...)<br />

( define receive ! ...)<br />

( lambda ( msg )<br />

( case msg<br />

(( send !) send !)<br />

(( receive !) receive !))))))<br />

( define ( mailbox-send ! m obj ) ((m ’send !) obj ))<br />

( define ( mailbox-receive ! m) ((m ’receive !)))<br />

Para receber uma mensagem, precisamos adquirir o mutex, verificar se a fila está vazia,<br />

retirar a mensagem e liberar o mutex. Se a fila estiver vazia, chamamos mutex-unlock!<br />

Versão Preliminar<br />

para esperar até que outra thread inclua uma mensagem e sinalize a variável de condição<br />

messages-available.<br />

( define receive !<br />

( lambda ()<br />

( let loop ()<br />

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

(if ( empty-q messages )<br />

( begin<br />

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

( loop ))<br />

( begin<br />

270<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!