domingo, 29 de abril de 2012

Concorrência Parte III - Sincronização

O mecanismo de sincronização apresentado no post anterior (join) é muito rudimentar. Para situações mais complexas como quando pretendemos que várias threads partilhei o mesmo recurso, como por exemplo uma impressora ou um ficheiro.
Várias threads a concorrer em tempo de execução pelo acesso a outra thread

Vamos simular uma situação em que uma impressora é partilhada por vários utilizadores, assim todos devem poder enviar trabalhos para serem impressos, no entanto quando a impressora estiver a imprimir um trabalho não deve interromper essa tarefa para iniciar a impressão de outro utilizador.

Como se pode ver nesta imagem o trabalho do utilizador 3 foi interrompido por outro trabalho do utilizador 6.

De modo a garantir que uma parte de código não é interrompida temos de a definir como sendo uma secção crítica, criando assim um bloco atómico de código que não pode ser interrompido.

Neste exemplo a parte crítica do código é o processo de impressão, assim utilizamos a instrução lock no código que imprime. Ao fazermos esta alteração tornamos a função que imprime thread safe, ou seja, segura para ser executado por várias threads.

Um erro comum é aplicar o lock a objectos diferentes entre as threads, ou seja, cada lock ser aplicado a uma cópia/implementação diferente da class, para que o lock funcione deve ser aplicado ao objecto que é partilhado pelas threads.

O projeto pode ser encontrado aqui.

Sem comentários:

Enviar um comentário