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

11.6.1 Suporte por hardware<br />

11.6.2 Memória transacional por software<br />

Em 1997 Shavit e Touitou propuseram implementar memória transacional sem suporte<br />

por hardware [46].<br />

11.7 thread pools<br />

Quando threads vivem por pouco tempo e são criadas em grande quantidade, há uma<br />

sobrecarga de tempo e recursos relacionada ao processo de criação e destruição de threads.<br />

Uma técnica de implementação (ou “padrão de projeto”) importante é o uso de pools de<br />

threads.<br />

Um número de threads é criado; estas threads não executam diretamente código<br />

relacionado ao trabalho que deve ser realizado. Estas threads buscam itens de trabalho<br />

em uma fila e os executam. Um item de trabalho consiste de um procedimento e seus<br />

dados (em <strong>Scheme</strong> isto se traduz naturalmente para fechos).<br />

Assim, uma mesma thread pode executar um procedimento A, retornar ao pool e<br />

mais tarde executar um procedimento B.<br />

Nossa implementação de exemplo usa três semáforos:<br />

• *work-q-nonempty*, inicializado <strong>com</strong> zero, é usado para indicar às threads trabalhadoras<br />

que há trabalho disponível na fila. O valor neste semáforo será o número<br />

de itens disponíveis (da mesma forma que o semáforo usado no problema produtor/consumidor);<br />

• *work-q-no-getters*, inicializado <strong>com</strong> um, é um lightswitch 7 usado para excluir<br />

as threads trabalhadoras enquanto a thread geradora de trabalho inclui itens. Este<br />

semáforo indica quantas threads trabalhadoras estão tentando retirar itens da fila;<br />

• *work-q-get-mutex*, inicializado <strong>com</strong> um (é um mutex), é usado para que apenas<br />

uma thread trabalhadora retire elementos da fila de cada vez (de outra forma o<br />

mesmo item de trabalho poderia ser tomado por duas threads).<br />

7 Veja a seção 11.3.3<br />

Versão Preliminar<br />

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