Exemplo # 01: sem construção de bloqueio
Vamos começar com o primeiro exemplo deste artigo para uso de bloqueio em C#. Então, temos que fazer uma estrutura de código C# primeiro. Sem a estrutura de código padrão C#, nosso código não funcionará. Assim, você precisa iniciá -lo com o uso da biblioteca "sistema" especificada pela palavra -chave "usando" no código. Como precisamos trabalhar em threads, precisamos especificar o espaço para nome da encadeamento da biblioteca do sistema por meio da palavra -chave "usando".
Ambas as bibliotecas são necessárias para a implementação de bloqueio e tópicos em nossos exemplos neste artigo. Depois disso, inicializamos uma classe simples de "teste" no código C#. Você também pode definir um espaço para nome antes da classe, mas não é necessário aqui. A classe “teste” contém um total de 2 funções. Um é uma função definida pelo usuário chamada "show ()" e o outro é a função principal () de C# que também é uma função do executor nos códigos C#. O processo de execução começa no método principal () deste programa. Temos usado a classe "Thread" do espaço para nome "Threading" para a criação de dois novos objetos de thread T1 e T1 com a ajuda de uma "nova" palavra -chave.
Dentro da criação de threads, usamos a função "show" nos argumentos de "Thread" para torná -lo uma função de thread. Como criamos 2 threads, significa que a função show () será usada 2 vezes no código como thread 1 e thread 2, respectivamente. Esta é apenas uma criação de fios e não sua execução. Para executar o thread, precisamos usar a função "Iniciar" do espaço para nome da classe Threading. Portanto, o objeto "T1" do thread 1 foi usado para chamar a função "Iniciar" para executar a função do thread "Mostrar". Após o primeiro tópico, o segundo thread T2 executará o método "show" usando a mesma função de início. Agora, quando um tópico for iniciado, a função show () será executada usando seu loop "for" para até 5 iterações. Até que o loop seja executado, continuará a executar seu “console.Declaração de função writeLine () ”para exibir o número de iteração usando a variável de iteração“ i ”. Após cada iteração, o tópico dormirá de 3 segundos usando a função "sono" de C# aqui. O mesmo será repetido quando um segundo tópico começar. Agora, como estamos usando threads para executar a função "show", não tem certeza de que ele o executará de uma maneira em que . Tópico 1 primeiro e depois thread 2. Vamos salvar nosso código para ver seu resultado.
Precisamos de comandos de compilador C# e de tempo de execução para compilar e executar nossos códigos. Nós já instalamos os dois. Assim, usamos o comando C# “MCS” usado como compilador C# para compilar este código recém -fabricado. A compilação retorna nada além de gera um novo arquivo "exe" na mesma pasta atual i.e. bem-sucedido.
Então, executamos este arquivo "exe" para o código C# com o comando de tempo de execução "mono" do C#. Como os dois tópicos foram iniciados na função principal (), eles continuam a executar a função show () um após o outro em cada iteração. Isso significa que um tópico estava pegando os recursos do outro tópico enquanto o primeiro nem sequer completou sua execução totalmente. Isso também pode causar impasse.
Exemplo # 02: com construção de bloqueio
Para evitar que os threads sejam executados ao mesmo tempo enquanto os recursos estão sendo compartilhados ou solicitados, precisamos usar a construção "Lock" no código C#. A construção de bloqueio garantirá, não permitirá que outro tópico obtenha recursos atualmente usados pelo processo atualmente em execução até concluir sua execução. Isso pode funcionar sobre a regra de prioridade ou . primeiro a chegar, primeiro a ser servido. Para usar a construção "Lock", temos que criar um objeto para travar usando a classe "Objeto" de C#.
Este objeto deve ser do tipo somente leitura estática. Você pode nomear tudo o que desejar. A criação de um objeto de bloqueio garante que um bloqueio seja criado e não aplicado a algumas partes do código. Nós o chamamos de "parar". Agora, precisamos criar uma construção com sua palavra -chave "bloquear" e especificar o nome de bloqueio em seus argumentos como "pare" na função "show". Como a função show () é o nosso tópico, temos que colocar sua implementação no construto "bloqueio" (i.e. a parte do código que queremos restringir o acesso a.) Agora, nosso código está pronto, pois o bloqueio foi aplicado ao pedaço de código dentro da função do thread. Salve este código atualizado e execute -o para ver seu resultado.
Compilamos esse código atualizado em nosso terminal do Ubuntu e executamos seu arquivo "exe" depois disso. Desta vez, toda a função "show" foi executada totalmente (i.e. "Para" o loop está concluído.) Isso ocorre porque, nas duas vezes, quando um thread é iniciado com a função "Iniciar", a construção de bloqueio "parada" bloqueou o código de função show () até que o primeiro thread concluiu sua execução. Depois disso, isso aconteceu com o thread 2 também. Portanto, nossa saída é suave.
A saída acima da balança será exibida sem nenhuma pausa e em um segundo na tela. Isso não permitirá que você veja como uma iteração funciona um após o outro quando não houver demora na execução enquanto estiver usando um bloqueio. Vamos atualizar a função "show" no mesmo código e adicionar a função de sono, levando 2 segundos de sono após a execução do console.Declaração de função writeLine () enquanto itera. Salve este código com Ctrl+S, feche o arquivo e abra o shell.
Depois de compilar o arquivo de código, executamos seu arquivo "exe" no shell. O código começa a executar seus threads. O primeiro tópico "show" começou enquanto dormia por 2 segundos após cada iteração, como mostrado abaixo.
Após o primeiro tópico "SHOW" completar sua execução, o bloqueio liberou o acesso à função do show e o Thread 2 foi adquirido para execução.
Conclusão:
Este artigo contém detalhes sobre a construção de bloqueio em C#. Discutimos nosso primeiro exemplo sem usar a construção "Lock" e obtivemos uma saída com a execução aleatória e não ordenada de uma função de thread. Discutimos as causas dessa execução não ordenada do fio também. Depois disso, discutimos um exemplo com o uso da construção "Lock" e obtivemos uma saída com uma maneira aleatória de execução de threads.