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

( define retira<br />

( lambda (a v)<br />

( set-valor ! a (- ( valor a) v ))))<br />

( define deposita<br />

( lambda (a v)<br />

( set-valor ! a (+ ( valor a) v ))))<br />

( define transfere<br />

( lambda (a b v)<br />

( with-account ( lock-conta a)<br />

( thread-sleep ! 0.200)<br />

( with-account ( lock-conta b)<br />

( retira a v)<br />

( deposita b v )))))<br />

( define conta-a ( make-conta 0))<br />

( define conta-b ( make-conta 0))<br />

( let (( threads ( map make-thread<br />

( list ( lambda ()<br />

( transfere conta-a conta-b 10))<br />

( lambda ()<br />

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

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

( transfere conta-b conta-a 5))))))<br />

( print ( valor conta-a ) "; " ( valor conta-b ) "\n")<br />

Neste exemplo, os recursos são contas bancárias. Para transferir um valor de A para<br />

B, uma thread obtém um mutex lock em A e depois tenta obter para B. Outra thread já<br />

obteve o mutex lock para B e então aguarda para obter o lock de A.<br />

Pode-se prevenir ou resolver deadlocks: para prevení-los é necessário eliminar pelo<br />

Versão Preliminar<br />

menos uma das condições para sua existência:<br />

• Exclusão mútua: um recurso pode ser alocado para no máximo um processo de cada<br />

vez;<br />

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