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

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

C# IEnumerable e IEnumerator

Neste artigo vamos aprender como utilizar a interface IEnumerator por forma a permitir utilizar um ciclo foreach num conjunto ou coleção de dados. A maior parte das coleções (listas e outras) já implementam a interface, mas neste caso vamos personalizar a maneira como percorremos a lista. Quando utilizamos código assim: foreach(Class c in Collection) { ... } O compilador converte este código em algo assim: IEnumerator cc = Collection.GetEnumerator() while(cc.MoveNext()) { c=(Class)cc.Current; ... } Ao implementar a interface IEnumerable significa que a classe implementa uma versão da função GetEnumerator() que deve devolver uma classe que implemente a interface IEnumerator. Vamos explorar um exemplo. Começamos pela classe client Esta classe permitirá guardar os dados dos clientes, existindo um campo para indicar se o cliente ainda está ativo ou não. De seguida temos uma classe que define uma lista de clientes e que implementa a interface IEnumerable que de

React - Introdução

 Neste post vamos fazer uma breve introdução ao React. React é uma framework javascript e por isso é importante ter conhecimentos desta linguagem de programação para melhor compreender o seu funcionamento. O que é necessário? Para construir páginas com React é necessário ter instalado a framework Node e o seu instalador de packages o npm. Com o Node instalado basta abrir uma janela da linha de comandos, eu aconselho utilizar o novo Windows Terminal ou o Cmder . Na sua linha de comando escolhida execute o comando: npx create-react-app Tutorial01 Este comando vai criar uma pasta com o nome Tutorial01 e instalar dos os ficheiros necessários para construir a sua primeira aplicação React dentro dessa pasta. De seguida entramos na pasta criada com o comando: cd Tutorial01 E iniciamos a aplicação com o comando: npm start Deve conseguir ver uma página com o seguinte aspeto: A partir daqui, até fechar a linha de comando, todas as alterações feitas aos ficheiros da sua aplicação são automaticam