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

O procedimento make-condition-variable retorna uma nova variável de condição;<br />

o predicado condition-variable verifica se um objeto é variável de condição. Para<br />

sinalizar uma variável de condição usamos condition-variable-signal!.<br />

Para esperar por uma condição chamamos mutex-unlock! <strong>com</strong> um terceiro argumento:<br />

(mutex-unlock! mutex variavel) libera mutex e bloqueia a thread até que<br />

variavel seja sinalizada.<br />

A SRFI-18 dá <strong>com</strong>o exemplo de uso típico de variáveis de condição o trecho de código<br />

a seguir.<br />

( let loop ()<br />

( mutex-lock ! m)<br />

(if ( condition-is-true )<br />

( begin<br />

( do-something-when-condition-is-true )<br />

( mutex-unlock ! m))<br />

( begin<br />

( mutex-unlock ! m cv)<br />

( loop ))))<br />

Implementamos agora uma solução para o problema do produtor/consumidor usando<br />

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

Usaremos a implementação de fila da Seção 3.3.2.<br />

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

Criamos uma fila q para servir de buffer, um mutex e uma variável de condição.<br />

( define q ( make-q ))<br />

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

( define not-empty ( make-condition-variable " not-empty "))<br />

Versão Preliminar<br />

O produtor cria listas da forma (i2i), e segue incluindo itens no buffer e incrementando<br />

i.<br />

Após criar um item, adquire o mutex, enfilera o item, e sinaliza a variável de condição<br />

not-empty, desbloqueando a thread consumidora se ela estiver bloqueada. Logo em<br />

seguida, libera o mutex, incrementa seu contador e volta ao início do laço.<br />

( define produce<br />

( let ((i 0))<br />

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