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 - Jerônimo C. Pellegrini<br />

grama for executado. Mesmo sem este artifício, o programa ainda seria suscetível à<br />

condição de corrida e o saldo seria muito provavelmente menor do que seiscentos.<br />

O procedimento deposita é onde acontece a leitura e atribuição da variável global,<br />

e é apenas ali que a execução concorrente se torna um problema. Trechos de programa<br />

<strong>com</strong>o este são chamados de regiões (ou seções) críticas.<br />

( define saldo 0)<br />

( define deposita<br />

( lambda ( valor )<br />

( let ((s saldo ))<br />

( thread-sleep ! (* ( random-real ) 0.020))<br />

( set ! saldo (+ valor s))<br />

( thread-sleep ! (* ( random-real ) 0.070)))))<br />

( define repete-deposita<br />

( lambda ()<br />

(do ((i 0 (+ 1 i )))<br />

((= i 20))<br />

( deposita 10))))<br />

( define cria-threads<br />

( lambda ( proc n)<br />

(if ( zero n)<br />

’()<br />

( cons ( make-thread proc )<br />

( cria-threads proc (- n 1))))))<br />

( let (( threads ( cria-threads repete-deposita 3)))<br />

( for-each thread-start ! threads )<br />

( for-each thread-join ! threads )<br />

( display " Saldo final : ")<br />

( display saldo )<br />

( newline ))<br />

Versão Preliminar<br />

Um trecho de código que modifica variáveis <strong>com</strong>partilhadas entre threads é<br />

chamado de seção crítica.<br />

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

229

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

Saved successfully!

Ooh no, something went wrong!