Threads: O problema dos Leitores e Escritores Implementado em C# <ul><li>Autores: </li></ul><ul><ul><li>Daniel Ramon Silva...
Threads <ul><li>É uma forma de um processo dividir-se em duas ou mais tarefas que podem ser executadas simultaneamente </l...
Threads e Processos – Diferenças <ul><li>Módulos executáveis de um processo  </li></ul><ul><ul><li>Um módulo executável é ...
Threads:  O Universo dos modelos de processos <ul><li>Existem 2 conceitos para os modelos: </li></ul><ul><li>Primeiro: Mod...
Threads:  O Universo dos modelos de processos <ul><li>Segundo: Thread de execução (Thread):  </li></ul><ul><ul><li>Contado...
Threads e Processos – Diferenças <ul><li>Os dois conceitos citados  (Processo e Thread de execução)  são importantes, pois...
Threads:  O Universo dos modelos de processos <ul><li>Importância dos modelos  (Processo e Thread de execução): </li></ul>...
Threads:  Sistemas monothread e multithread <ul><li>Sistemas  monothread : Sistemas que suportam apenas uma única thread e...
Threads:  O Universo dos modelos de processos <ul><li>Resposta: </li></ul><ul><ul><li>Nos Sistemas multithread várias thre...
Threads:  Tipos (Usuário e Núcleo) <ul><li>Thread de usuário: </li></ul><ul><ul><li>Todos os pacotes e controles de thread...
Threads:  Tipos (Usuário e Núcleo) <ul><li>Thread de usuário: </li></ul><ul><ul><li>Vantagem Principal:  </li></ul></ul><u...
Threads:  Tipos (Usuário e Núcleo) <ul><li>Thread de núcleo: </li></ul><ul><ul><li>Grande vantagem: Caso uma thread seja b...
Threads:  Tipos (Usuário e Núcleo) <ul><li>Thread de núcleo: </li></ul><ul><ul><li>Chamadas ao sistema possuem um custo ma...
Threads:  Comunicação entre as Threads <ul><li>Com freqüência as threads precisam trocar informações entre si para continu...
Threads:  Comunicação entre as Threads <ul><li>Região Crítica: </li></ul><ul><ul><li>Região de memória compartilhada que a...
Threads:  Comunicação entre as Threads <ul><li>Região Crítica: </li></ul><ul><ul><li>Condição de disputa: </li></ul></ul><...
Threads:  Comunicação entre as Threads <ul><li>Região Crítica: </li></ul><ul><ul><li>Condição de disputa: </li></ul></ul><...
Threads:  Comunicação entre as Threads <ul><li>Exclusão Mútua: </li></ul><ul><ul><li>Solução encontrada para evitar que do...
Threads:  Comunicação entre as Threads <ul><li>Exclusão Mútua (As Quatro Condições): </li></ul><ul><ul><li>Nunca dois proc...
Threads:  Problemas com o uso de threads <ul><li>O uso de threads acarreta alguns problemas como:  </li></ul><ul><ul><li>O...
Threads:  Problemas com o uso de threads <ul><li>Deadlock: </li></ul><ul><ul><li>Ocorre quando há um impasse e dois ou mai...
O Problema dos Leitores e Escritores <ul><li>Modela o acesso a uma Base de Dados. </li></ul><ul><li>Ocorre em Processos Co...
O Problema dos Leitores e Escritores <ul><li>Vários Processos visando a mesma Base de Dados. </li></ul>Base  de  Dados PL ...
O Problema dos Leitores e Escritores <ul><li>Enquanto existir pelo menos um Processo Leitor acessando a Base de Dados, o a...
O Problema dos Leitores e Escritores <ul><li>Enquanto existir pelo menos um Processo Leitor acessando a Base de Dados e ex...
O Problema dos Leitores e Escritores <ul><li>Se sempre chegarem Processos Leitores e existir pelo menos um Processo Leitor...
O Problema dos Leitores e Escritores <ul><li>Se não existir nenhum Processo tanto Leitor quanto Escritor acessando a Base ...
O Problema dos Leitores e Escritores <ul><li>Processo Escritor faz com que outros Processos esperem pelo acesso. </li></ul...
O Problema dos Leitores e Escritores <ul><li>Pseudocódigo abordando solução </li></ul>semaphore mutex = 1;  // controla ac...
O Problema dos Leitores e Escritores void reader(void) { while(TRUE) { // repete para sempre down(&mutex);  // obtém acess...
O Problema dos Leitores e Escritores <ul><li>Vantagens </li></ul><ul><li>Evita Espera Ocupada. </li></ul><ul><li>Melhor us...
Threads no C# <ul><li>O C# provê vários recursos para utilização de threads </li></ul><ul><ul><li>Iniciar threads </li></u...
Threads no C#: Criando e Iniciando <ul><li>É bastante simples criar e iniciar uma thread </li></ul><ul><li>Basta criar uma...
Threads no C#: Exemplo Olá Mundo <ul><ul><li>class Ola_Mundo { </li></ul></ul><ul><ul><li>static void Main() { </li></ul><...
Threads no C#: Sincronização <ul><li>A forma mais simples de sincronizar threads é utilizando o método  Join </li></ul><ul...
Threads no C#: Método  Join class Ola_Mundo { static void Main() { Thread t = new Thread(new ThreadStart(Imprime)); t.Star...
Threads no C#: Bloqueio  Lock <ul><li>É a formais de bloqueio mais simples e permite obter a posse de um objeto, bloqueand...
Threads no C#: Bloqueio  Lock <ul><ul><ul><li>lock (contador) { </li></ul></ul></ul><ul><ul><ul><li>contador++; </li></ul>...
Threads no C#: Classe  Mutex <ul><li>A classe mutex funciona de forma parecida com o bloqueio  lock </li></ul><ul><li>Por ...
Threads no C#: Classe  Mutex <ul><ul><ul><ul><ul><li>mutex.WaitOne(); </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><l...
Threads no C#: Classe  Semaphore <ul><li>É uma extensão da classe  mutex </li></ul><ul><li>Como principais características...
Threads no C#: Classe  Semaphore <ul><ul><ul><ul><li>semaforo.WaitOne(); </li></ul></ul></ul></ul><ul><ul><ul><ul><li>cont...
Threads no C#: Classe  Monitor <ul><li>O C# oferece ainda a classe Monitor que provê outras funcionalidades como: </li></u...
Threads no C#: Outros recursos <ul><li>Nomear a thread </li></ul><ul><li>Atribuir prioridade às threads </li></ul><ul><ul>...
Threads no C#:  Os leitores e escritores <ul><li>Programa desenvolvido com a solução para o problema dos leitores e escrit...
Próximos SlideShares
Carregando em…5
×

Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMENTADO EM C#

5.168 visualizações

Publicada em

Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMENTADO EM C#.

Publicada em: Tecnologia, Negócios
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
5.168
No SlideShare
0
A partir de incorporações
0
Número de incorporações
490
Ações
Compartilhamentos
0
Downloads
105
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMENTADO EM C#

  1. 1. Threads: O problema dos Leitores e Escritores Implementado em C# <ul><li>Autores: </li></ul><ul><ul><li>Daniel Ramon Silva Pinheiro </li></ul></ul><ul><ul><li>Danilo Santos Souza </li></ul></ul><ul><ul><li>Rafael Oliveira Vasconcelos </li></ul></ul><ul><li>Orientadora: </li></ul><ul><ul><li>Maria de Fátima A. S. Colaço </li></ul></ul>
  2. 2. Threads <ul><li>É uma forma de um processo dividir-se em duas ou mais tarefas que podem ser executadas simultaneamente </li></ul><ul><li>Nos hardwares equipados com múltiplos núcleos, as linhas de execução de uma thread, podem ser executadas paralelamente, </li></ul><ul><li>Já nos hardwares com um único núcleo, cada linha de execução é processada de forma aparentemente simultânea. Neste caso a mudança entre uma linha e outra é feita de forma tão rápida que para o usuário isso está acontecendo paralelamente. </li></ul>
  3. 3. Threads e Processos – Diferenças <ul><li>Módulos executáveis de um processo </li></ul><ul><ul><li>Um módulo executável é um conjunto de instruções de um programa que devem ser seguidos para a conclusão do mesmo. </li></ul></ul><ul><li>Processos são módulos separados e carregáveis </li></ul><ul><li>Threads não são carregados . Threads são iniciados dentro de um processo (Pai). </li></ul><ul><li>O processo Pai pode iniciar várias threads ao mesmo tempo. </li></ul>
  4. 4. Threads: O Universo dos modelos de processos <ul><li>Existem 2 conceitos para os modelos: </li></ul><ul><li>Primeiro: Modo de ver um processo: </li></ul><ul><ul><li>Espaço de endereçamento (código e os dados de programa). Alguns recursos alocados (arquivos abertos, processos filhos). </li></ul></ul><ul><ul><li>Objetivo: Agrupar todos eles em forma de processos para facilitar o gerenciamento dos recursos. </li></ul></ul>
  5. 5. Threads: O Universo dos modelos de processos <ul><li>Segundo: Thread de execução (Thread): </li></ul><ul><ul><li>Contador de programa (controla qual instrução da thread deverá ser executada em seguida pelo núcleo) </li></ul></ul><ul><ul><li>Registradores (com as variáveis de trabalho atuais) </li></ul></ul><ul><ul><li>Pilha estruturada pelo conjunto de procedimentos chamados, mas ainda não concluídos (informa o histórico da execução). </li></ul></ul>
  6. 6. Threads e Processos – Diferenças <ul><li>Os dois conceitos citados (Processo e Thread de execução) são importantes, pois delimitam os conceitos entre threads e processos, que apesar de semelhantes, são conceitos diferentes. </li></ul><ul><li>A característica que os threads acrescentam ao conceito de processos é a permissão de múltiplas execuções ocorrerem em um mesmo processo de forma independente uma das outras. </li></ul>
  7. 7. Threads: O Universo dos modelos de processos <ul><li>Importância dos modelos (Processo e Thread de execução): </li></ul><ul><ul><li>Delimitam os conceitos entre threads e processos, que apesar de semelhantes, são conceitos diferentes. </li></ul></ul><ul><li>A característica que os threads acrescentam ao conceito de processos é a permissão de múltiplas execuções ocorrerem em um mesmo processo de forma independente uma das outras. </li></ul>
  8. 8. Threads: Sistemas monothread e multithread <ul><li>Sistemas monothread : Sistemas que suportam apenas uma única thread em execução por vez. </li></ul><ul><li>Sistemas multithread : Sistemas que suportam mais de uma por vez. </li></ul><ul><li>Questão: Qual a diferença de ter várias threads sendo executadas em um único processo (multithread), e vários processos sendo executados em um computador? </li></ul>
  9. 9. Threads: O Universo dos modelos de processos <ul><li>Resposta: </li></ul><ul><ul><li>Nos Sistemas multithread várias threads estão compartilhando um mesmo espaço de endereçamento na memória, assim como os recursos alocados pelo processo criador da thread. </li></ul></ul><ul><ul><li>Já nos Sistemas monothread os processos compartilham um espaço físico de memória. </li></ul></ul>
  10. 10. Threads: Tipos (Usuário e Núcleo) <ul><li>Thread de usuário: </li></ul><ul><ul><li>Todos os pacotes e controles de threads estão no espaço do usuário. O núcleo não sabe que existem essas threads. </li></ul></ul><ul><ul><li>As threads serão tratadas de forma simples (monothread). Mesmo que existam vários núcleos (multiprocessamento), somente os processos é que serão executados paralelamente e não as threads. </li></ul></ul><ul><ul><li>Para o núcleo será apenas mais uma linha de execução do processo. </li></ul></ul>
  11. 11. Threads: Tipos (Usuário e Núcleo) <ul><li>Thread de usuário: </li></ul><ul><ul><li>Vantagem Principal: </li></ul></ul><ul><ul><ul><li>Versatilidade, pois elas funcionam tanto em sistemas que suportem ou não o uso de threads </li></ul></ul></ul><ul><ul><li>Implementação interna ao processo criador da thread. </li></ul></ul><ul><ul><li>Sistema operacional não irá interferir nesta criação, desta forma o sistema executará a thread como se fosse apenas mais uma linha de execução do processo. </li></ul></ul>
  12. 12. Threads: Tipos (Usuário e Núcleo) <ul><li>Thread de núcleo: </li></ul><ul><ul><li>Grande vantagem: Caso uma thread seja bloqueada, as outras threads que forem geradas pelo mesmo processo poderão dar continuidade às suas linhas de execução, sem a necessidade da thread bloqueada concluir suas linhas de execução. </li></ul></ul><ul><ul><li>O núcleo sabe da existência das threads </li></ul></ul><ul><ul><li>O processo não precisará de tabela para gerenciar as threads, o núcleo se encarregará de tudo, os processos apenas realizam chamadas ao núcleo para a manipulação de suas threads. </li></ul></ul>
  13. 13. Threads: Tipos (Usuário e Núcleo) <ul><li>Thread de núcleo: </li></ul><ul><ul><li>Chamadas ao sistema possuem um custo maior se comparadas com as chamadas que um sistema de threads de usuário realiza. </li></ul></ul><ul><ul><li>Sistemas utilizam-se da ‘reciclagem’ de threads, desta forma, quando uma thread é destruída, ela é apenas marcada como não executável, sem afetar sua estrutura. </li></ul></ul><ul><ul><ul><li>Conseqüência: A criação de uma nova thread será mais rápida, com sua estrutura já montada, basta apenas a atualização de suas informações. </li></ul></ul></ul>
  14. 14. Threads: Comunicação entre as Threads <ul><li>Com freqüência as threads precisam trocar informações entre si para continuar suas linhas de execução. </li></ul><ul><li>Como elas compartilham um espaço de endereçamento comum isso torna-se um pouco mais fácil, entretanto ainda é necessário um controle para evitar embaraços entre elas. </li></ul><ul><li>Esses embaraços geralmente ocorrem quando elas acessam uma variável compartilhada ao mesmo tempo, ou seja, dentro de uma região crítica. </li></ul>
  15. 15. Threads: Comunicação entre as Threads <ul><li>Região Crítica: </li></ul><ul><ul><li>Região de memória compartilhada que acessa um recurso que está compartilhado e que não pode ser acessado concorrentemente por mais de uma linha de execução </li></ul></ul><ul><ul><li>Como o próprio nome já diz, por ser uma área crítica necessita de cuidados para que não hajam problemas futuros devido à má utilização da mesma. </li></ul></ul>
  16. 16. Threads: Comunicação entre as Threads <ul><li>Região Crítica: </li></ul><ul><ul><li>Condição de disputa: </li></ul></ul><ul><ul><ul><li>Conjunto de recursos que deve ser compartilhado entre processos no qual, em um mesmo intervalo tempo, dois ou mais processos tentem alocar uma mesma parte de um mesmo recurso para poder utilizá-lo. Nesta hora que ocorre o problema do controle de disputa. </li></ul></ul></ul>
  17. 17. Threads: Comunicação entre as Threads <ul><li>Região Crítica: </li></ul><ul><ul><li>Condição de disputa: </li></ul></ul><ul><ul><ul><li>Necessidade de encontrar uma forma de bloquear que outros processos usem uma área compartilhada que esteja sendo usada até que ela seja liberada pelo processo que a esteja utilizando. </li></ul></ul></ul><ul><ul><ul><li>A essa solução denomina-se exclusão mútua. </li></ul></ul></ul>
  18. 18. Threads: Comunicação entre as Threads <ul><li>Exclusão Mútua: </li></ul><ul><ul><li>Solução encontrada para evitar que dois ou mais processos ou threads tenham acesso simultaneamente a alguma região crítica de algum recurso que esteja compartilhado. </li></ul></ul><ul><ul><li>Para que a solução seja válida, devem ser satisfeitas quatro condições para que os processos e threads concorrentes à mesma região crítica sejam executados de forma eficiente e corretamente. </li></ul></ul>
  19. 19. Threads: Comunicação entre as Threads <ul><li>Exclusão Mútua (As Quatro Condições): </li></ul><ul><ul><li>Nunca dois processos podem estar simultaneamente em suas regiões críticas; </li></ul></ul><ul><ul><li>Nada pode ser afirmado sobre a velocidade ou sobre o número de CPUs; </li></ul></ul><ul><ul><li>Nenhum processo executando fora de sua região crítica pode bloquear outros processos; </li></ul></ul><ul><ul><li>Nenhum processo deve esperar eternamente para entrar em sua região crítica; </li></ul></ul>
  20. 20. Threads: Problemas com o uso de threads <ul><li>O uso de threads acarreta alguns problemas como: </li></ul><ul><ul><li>Os de acesso à região crítica </li></ul></ul><ul><ul><li>Dificuldade de implementação </li></ul></ul><ul><ul><li>Dificuldade de depuração do código </li></ul></ul><ul><ul><li>Deadlock e o Starvation </li></ul></ul>
  21. 21. Threads: Problemas com o uso de threads <ul><li>Deadlock: </li></ul><ul><ul><li>Ocorre quando há um impasse e dois ou mais processos ou threads ficam impedidos de continuar suas execuções, ou seja, ficam bloqueados para sempre. </li></ul></ul><ul><li>Starvation: </li></ul><ul><ul><li>Ocorre quando um processo ou thread nunca é executado, pois processos ou threads de maior importância sempre tomam a posse do núcleo fazendo com que os de menores prioridades nunca sejam executados. </li></ul></ul>
  22. 22. O Problema dos Leitores e Escritores <ul><li>Modela o acesso a uma Base de Dados. </li></ul><ul><li>Ocorre em Processos Concorrentes. </li></ul><ul><li>Processos Leitores somente lêem a Região Crítica. </li></ul><ul><li>Processos Escritores alteram a Região Crítica </li></ul><ul><li>Acesso simultâneo para Processos Leitores pelo fato de não alterarem a Região Crítica. </li></ul><ul><li>Acesso Exclusivo para Processo Escritor pelo fato de alterar a Região Crítica. </li></ul><ul><li>Para melhor entendimento a seguir, considere a Base de Dados como Região Crítica. </li></ul>
  23. 23. O Problema dos Leitores e Escritores <ul><li>Vários Processos visando a mesma Base de Dados. </li></ul>Base de Dados PL PL PL PE PL – Processos Leitores PE – Processos Escritores Esperando Acesso a Base de Dados Acessando a Base de Dados 1 2 4 3
  24. 24. O Problema dos Leitores e Escritores <ul><li>Enquanto existir pelo menos um Processo Leitor acessando a Base de Dados, o acesso para a chegada de novos Processos Leitores será concedido. </li></ul>Base de Dados PL PL PL Base de Dados PL PL PL 1 2 4 PL PL PL 1 2 4 6 9 7 PL – Processos Leitores PE – Processos Escritores Esperando Acesso a Base de Dados Acessando a Base de Dados
  25. 25. O Problema dos Leitores e Escritores <ul><li>Enquanto existir pelo menos um Processo Leitor acessando a Base de Dados e existir Processo Escritor em espera, a chegada de Processos Leitores para acesso será concedido e o Processo Escritor continuará esperando pelo acesso. </li></ul>Base de Dados PL PL Base de Dados PL PL PL 1 2 PL PL PE 1 2 4 6 9 7 PE 4 PL – Processos Leitores PE – Processos Escritores Esperando Acesso a Base de Dados Acessando a Base de Dados
  26. 26. O Problema dos Leitores e Escritores <ul><li>Se sempre chegarem Processos Leitores e existir pelo menos um Processo Leitor acessando, o Processo Escritor pode chegar a um problema denominado Starvation, que é a possibilidade do Processo Escritor nunca acessar a Base de Dados pelo fato de sempre estarem chegando Processos Leitores. </li></ul>
  27. 27. O Problema dos Leitores e Escritores <ul><li>Se não existir nenhum Processo tanto Leitor quanto Escritor acessando a Base de Dados, o acesso é concedido normalmente. </li></ul>Base de Dados Base de Dados PE 4 PL – Processos Leitores PE – Processos Escritores Esperando Acesso a Base de Dados Acessando a Base de Dados
  28. 28. O Problema dos Leitores e Escritores <ul><li>Processo Escritor faz com que outros Processos esperem pelo acesso. </li></ul>Base de Dados PL PL PE PE 1 2 4 3 PL – Processos Leitores PE – Processos Escritores Esperando Acesso a Base de Dados Acessando a Base de Dados
  29. 29. O Problema dos Leitores e Escritores <ul><li>Pseudocódigo abordando solução </li></ul>semaphore mutex = 1; // controla acesso a região critica semaphore db = 1; // controla acesso a base de dados int rc = 0; // número de processos lendo ou querendo ler void writer(void) { while (TRUE) { // repete para sempre think_up_data(); // região não critica down(&db); // obtém acesso exclusivo write_data_base(); // atualiza os dados up(&db); // libera o acesso exclusivo } } Variáveis Procedimento do Escritor
  30. 30. O Problema dos Leitores e Escritores void reader(void) { while(TRUE) { // repete para sempre down(&mutex); // obtém acesso exclusivo a região critica rc = rc + 1; // um leitor a mais agora if (rc == 1) down(&db); //se este for o primeiro leitor bloqueia a base de dados up(&mutex) // libera o acesso a região critica read_data_base(); //acesso aos dados down(&mutex); // obtém acesso exclusivo a região critica rc = rc -1; // menos um leitor if (rc == 0) up(&db); // se este for o último leitor libera a base de dados up(&mutex) // libera o acesso a região critica use_data_read(); // utiliza o dado } } Procedimento do Leitor
  31. 31. O Problema dos Leitores e Escritores <ul><li>Vantagens </li></ul><ul><li>Evita Espera Ocupada. </li></ul><ul><li>Melhor uso da Multiprogramação. </li></ul><ul><li>Desvantagem </li></ul><ul><li>Pode ocasionar Starvation. </li></ul>
  32. 32. Threads no C# <ul><li>O C# provê vários recursos para utilização de threads </li></ul><ul><ul><li>Iniciar threads </li></ul></ul><ul><ul><li>Bloqueio simples </li></ul></ul><ul><ul><li>Mutex, semáforo </li></ul></ul><ul><ul><li>Monitores </li></ul></ul><ul><ul><li>Prioridade </li></ul></ul><ul><ul><li>Manipulação de estados </li></ul></ul><ul><li>Uso do namespace System.Threading </li></ul>
  33. 33. Threads no C#: Criando e Iniciando <ul><li>É bastante simples criar e iniciar uma thread </li></ul><ul><li>Basta criar uma variável do tipo Thread e passar no construtor o método que será executado </li></ul><ul><ul><li>ThreadStart delegado = new Thread Start(metodo); </li></ul></ul><ul><ul><li>Thread t = new Thread(delegado;) </li></ul></ul><ul><li>Ou </li></ul><ul><ul><li>Thread t = new Thread( ThreadStart(metodo) ); </li></ul></ul><ul><li>Iniciar a thread é bastantes intuitivo </li></ul><ul><ul><li>t.Start(); </li></ul></ul>
  34. 34. Threads no C#: Exemplo Olá Mundo <ul><ul><li>class Ola_Mundo { </li></ul></ul><ul><ul><li>static void Main() { </li></ul></ul><ul><ul><li>Thread t = new Thread(new ThreadStart(Imprime)); </li></ul></ul><ul><ul><li>t.Start(); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>static void Imprime() { </li></ul></ul><ul><ul><li>Console.WriteLine(&quot;Ola Mundo!&quot;); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>} </li></ul></ul>
  35. 35. Threads no C#: Sincronização <ul><li>A forma mais simples de sincronizar threads é utilizando o método Join </li></ul><ul><li>Este método faz o bloqueio do programa até que a thread seja executada por completo, sendo então liberado para prosseguir com as demais instruções. </li></ul><ul><li>Garante que o fluxo de execução só prosseguirá quando a thread terminar sua execução. </li></ul><ul><li>Esta é uma forma bastante simples da manter a sincronização entre threads, porém anula a execução paralela, principal motivo para o uso de threads. </li></ul>
  36. 36. Threads no C#: Método Join class Ola_Mundo { static void Main() { Thread t = new Thread(new ThreadStart(Imprime)); t.Start(); t.Join(); Console.WriteLine(&quot;Fim do programa.&quot;); } static void Imprime() { Console.WriteLine(&quot;Ola Mundo!&quot;); } }
  37. 37. Threads no C#: Bloqueio Lock <ul><li>É a formais de bloqueio mais simples e permite obter a posse de um objeto, bloqueando um bloco de código </li></ul><ul><li>Evita a condição de corrida e garante a exclusão mútua </li></ul><ul><li>Caso outra thread tente realizar o bloqueio de um objeto que se encontra bloqueado, a thread será bloqueada pelo sistema operacional e só poderá continuar quando o objetivo for liberado </li></ul><ul><li>Por ser a forma mais simples de realizar um bloqueio, também é mais rápida. </li></ul>
  38. 38. Threads no C#: Bloqueio Lock <ul><ul><ul><li>lock (contador) { </li></ul></ul></ul><ul><ul><ul><li>contador++; </li></ul></ul></ul><ul><ul><ul><li>Console.WriteLine(contador); </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul>
  39. 39. Threads no C#: Classe Mutex <ul><li>A classe mutex funciona de forma parecida com o bloqueio lock </li></ul><ul><li>Por não realizar o bloqueio por blocos de código, permite que tanto o bloqueio como o desbloqueio seja realizado em diferentes regiões do código com uso dos métodos WaitOne e ReleaseMutex </li></ul><ul><li>Garante a exclusão mútua de uma região crítica </li></ul><ul><li>A tentativa de bloqueio de um objeto já bloqueado é análoga a forma anterior </li></ul>
  40. 40. Threads no C#: Classe Mutex <ul><ul><ul><ul><ul><li>mutex.WaitOne(); </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>//bloqueio realizado </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>contador++; </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>Console.WriteLine(contador); </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>mutex.ReleaseMutex(); </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>//recurso liberado </li></ul></ul></ul></ul></ul>
  41. 41. Threads no C#: Classe Semaphore <ul><li>É uma extensão da classe mutex </li></ul><ul><li>Como principais características permite que um ou mais processos entrem na região crítica e que o bloqueio realizado por uma thread possa ser desfeito por outra thread, recurso que pode ser útil em determinados problemas, como no problema dos leitores e escritores. </li></ul><ul><li>Na inicialização deve ser informado o valor máximo e inicial do semáforo </li></ul><ul><li>Caso o semáforo seja inicializado com valor 1, tem o mesmo funcionamento do mutex </li></ul>
  42. 42. Threads no C#: Classe Semaphore <ul><ul><ul><ul><li>semaforo.WaitOne(); </li></ul></ul></ul></ul><ul><ul><ul><ul><li>contador++; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Console.WriteLine(contador); </li></ul></ul></ul></ul><ul><ul><ul><ul><li>semaforo.Release(); </li></ul></ul></ul></ul>
  43. 43. Threads no C#: Classe Monitor <ul><li>O C# oferece ainda a classe Monitor que provê outras funcionalidades como: </li></ul><ul><li>Sinalizar e esperar por uma sinalização de outra thread </li></ul><ul><ul><li>Pulse ou PulseAll e Enter </li></ul></ul><ul><li>Outro recurso interessante é o TryEnter que como o próprio nome diz, tenta obter o acesso ao objeto, caso não seja possível retorna o valor false </li></ul><ul><li>O método Enter funciona de maneira semelhante aos já mencionados </li></ul><ul><li>É 33 vezes mais rápida que a classe Mutex </li></ul>
  44. 44. Threads no C#: Outros recursos <ul><li>Nomear a thread </li></ul><ul><li>Atribuir prioridade às threads </li></ul><ul><ul><li>Lowest , BelowNormal , Normal , AboveNormal e Highest </li></ul></ul><ul><li>Indicar se a thread deve ser executada em segundo plano </li></ul><ul><li>Adormecer por um tempo determinado – Sleep(x) </li></ul><ul><li>Suspender - Suspend </li></ul><ul><li>Retomar - Resume </li></ul><ul><li>Interromper – Interrupt </li></ul><ul><li>Abortar - Abort </li></ul>
  45. 45. Threads no C#: Os leitores e escritores <ul><li>Programa desenvolvido com a solução para o problema dos leitores e escritores </li></ul>

×