Avançar para o conteúdo principal

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.

Comentários

Mensagens populares deste blogue

Upgrade do Windows Home para Pro sem formatar

 Há algum tempo que tentava fazer o upgrade do meu Windows 10 da versão Home para a versão Pro, mas chegava sempre a um ponto em que me era solicitado para formatar o sistema e não estava para isso. Finalmente conseguinte seguindo estes passos: - seguinte estes passos  utilizei uma das chaves genéricas para o Windows 10 Pro e fui a Settings > Update & Security > Activation > Change the product key; - após inserir uma das chaves o Windows instala as funcionalidades Pro e pede para reiniciar; - agora tem o Windows Pro mas não está ativado, assim fui ao site urcdkeys  onde comprei uma chave para o Windows Pro por menos de €20; - com essa chave voltei a funcionalidade Change the product key e ativei o Windows; - e pronto, Windows Pro ativado sem formatar ou reinstalar. Importante : eu não tenho nada a ver com o site urcdkeys por isso a vossa experiência pode correr de forma diferente da minha.

Vamos fazer um carro com o Unity 3D

Neste artigo vamos fazer um carro, simples, com o Unity 3D. A ideia é utilizar o motor de física do Unity 3D para simular o comportamento do carro. Os passos a seguir são: [1] - Criar um projeto novo

Tem troco

Para hoje um pequeno programa que dá troco, bem dar não dá mas calcula o troco a dar em função das moedas disponíveis. Neste projeto vamos utilizar o novo Visual Studio 2012. Como era de se esperar vamos iniciar um projeto novo: Agora adicionamos os seguintes elementos:  - um botão para calcular as moedas a dar de troco  - um botão para repor o número de moedas iniciais disponíveis  - uma textbox para introduzir o valor a pagar  - uma textbox para introduzir o valor entregue  - umas labels para informar o utilizador do que deve introduzir e outra para mostrar o troco  - por fim uma grelha para mostrar os valores das moedas e as quantidades disponíveis de cada uma. A janela principal do programa fica assim: Agora o código, primeiro o evento load do formulário, neste vamos definir os valores das moedas e as respetivas quantidades Para guardar estes valores vamos necessitar de uma variável definida ao nível do formulário, logo abaixo da definição da class: Public Class Form1     Public mo