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

Função exemplo_deadlock<br />

a ← make_thread processo_A;<br />

b ← make_thread processo_B;<br />

thread_start (a, b);<br />

thread_join (a, b);<br />

processo A<br />

tenta obter<br />

recurso Y<br />

alocado para<br />

alocado para<br />

recurso X<br />

tenta obter<br />

processo B<br />

Figura 10.1: O processo A espera pelo recurso Y, que está alocado para B. No entanto, B<br />

só liberará Y após obter X, que está alocado para A.<br />

tentam obter o mesmo mutex, uma delas permanece bloqueada até que a outra libere o<br />

mutex.<br />

O programa <strong>Scheme</strong> a seguir, por exemplo, sempre entrará em deadlock. Os procedimentos<br />

make-mutex, mutex-lock! e mutex-unlock! são usados para criar, travar e liberar<br />

mutexes.<br />

( define make-conta<br />

( lambda (v)<br />

( cons v ( make-mutex ))))<br />

( define valor car )<br />

( define set-valor ! set-car !)<br />

( define lock-conta cdr )<br />

Versão Preliminar<br />

( define-syntax with-account<br />

( syntax-rules ()<br />

((_ r body ...)<br />

( begin<br />

( mutex-lock ! r)<br />

body ...<br />

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

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

231

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

Saved successfully!

Ooh no, something went wrong!