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

( lambda ()<br />

( let ((x ( list i (* 2 i ))))<br />

( mutex-lock ! lock )<br />

( enqueue ! x q)<br />

( condition-variable-signal ! not-empty )<br />

( mutex-unlock ! lock )<br />

( set ! i (+ 1 i))<br />

( produce )))))<br />

A thread consumidora <strong>com</strong>eça adquirindo o mutex. Em seguida verifica se a fila está<br />

vazia – se estiver, chama mutex-unlock!, liberando o mutex para o produtor e bloqueando<br />

a si mesma até que not-empty seja sinalizada. Ao ser acordada, readquire o mutex e verifica<br />

se a fila ainda está vazia.<br />

Quando a fila não estiver vazia, o consumidor retira um item, mostra, e libera o<br />

mutex. Depois re<strong>com</strong>eça o laço.<br />

( define consume<br />

( lambda ()<br />

( let wait-for-it ()<br />

( mutex-lock ! lock )<br />

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

( begin<br />

( mutex-unlock ! lock not-empty )<br />

( wait-for-it ))))<br />

( let ((z ( dequeue ! q )))<br />

( display z)<br />

( newline ))<br />

( mutex-unlock ! lock )<br />

( consume )))<br />

Agora basta que criemos as threads produtora e consumidora.<br />

( let ((p ( make-thread produce ))<br />

(c ( make-thread consume )))<br />

( print " starting !\n")<br />

( thread-start ! c)<br />

( thread-start ! p)<br />

( thread-join ! c)<br />

( thread-join ! p))<br />

Versão Preliminar<br />

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

243

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

Saved successfully!

Ooh no, something went wrong!