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

10.1.2 Dependência de velocidade<br />

O tempo que cada instrução atômica executa em um processo varia de acordo <strong>com</strong> muitos<br />

fatores, <strong>com</strong>o atividade de entrada e saída no <strong>com</strong>putador, presença de outros processos<br />

e prioridade dada a cada processo. Não se pode determinar a priori quantas instruções<br />

atômicas um processo poderá executar antes que outro processo também o faça. Quando<br />

estas diferenças na velocidade de execução de diferentes processos causam diferenças no<br />

resultado esperado de uma <strong>com</strong>putação, há uma condição de corrida.<br />

No exemplo a seguir há uma variável global saldo, modificada por três threads<br />

concorrentemente.<br />

Usaremos os procedimentos make-thread, que cria uma thread a partir de um procedimento;<br />

thread-start, que inicia uma lista de threads criadas por make-thread; e<br />

thread-join, que espera até que uma lista de threads termine.<br />

Função deposita(valor)<br />

s ← saldo<br />

saldo ← s + valor<br />

Função repete-deposita<br />

para todo 1 i 20 faça<br />

deposita 10;<br />

Função condicao-de-corrida<br />

x ← make_thread repete-deposita<br />

y ← make_thread repete-deposita<br />

z ← make_thread repete-deposita<br />

thread_start (x, y, z)<br />

thread_join (x, y, z)<br />

O valor de saldo após a execução dos dois processos concorrentemente dependerá da<br />

velocidade de execução de cada processo, e poderá mudar cada vez que o programa for<br />

executado: apesar de sessenta depósitos de valor dez serem efetuados, o valor do saldo<br />

final difilmente será igual a seiscentos.<br />

Versão Preliminar<br />

A seguir traduzimos este exemplo para <strong>Scheme</strong> usando a SRFI 18. Usaremos thread-sleep!<br />

<strong>com</strong> um número aleatóreo <strong>com</strong>o argumento nas threads que fazem depósitos. Desta forma<br />

aumentamos a probabilidade de que os resultados sejam diferentes cada vez que o pro-<br />

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