Aqui, neste guia, explicaremos como usamos a classe Mutex na programação C#. Fornecemos exemplos diferentes de usar esta classe mutex () em nosso programa C#. Realizamos os exemplos dados no Ubuntu 20.04.
Exemplo 1
Vamos realizar um exemplo usando esta classe mutex (). Como estamos usando o Ubuntu 20.04 Para realizar esses exemplos, temos que abrir o editor de texto deste Ubuntu 20.04 e, em seguida, crie um arquivo com qualquer nome de nossa escolha e salve este arquivo com a extensão do arquivo de “.cs ”. Em seguida, digite o seguinte código neste arquivo. Também explicamos cada linha deste programa fornecido em detalhes abaixo.
A primeira linha desse código C# é "usando o sistema", uma biblioteca e, ao usar esta biblioteca, podemos obter diferentes classes e funções do nosso código C#. Temos a classe "Console" e a função "Writeline" usando esta biblioteca. A palavra -chave "usando" é usada para receber parâmetros. O sistema. Threading ”está aqui para gerar tarefas e receber objetos da classe. Agora, vamos importar o espaço para nome com o nome "DemOMutex". Também criamos uma classe chamada "Program". Criamos uma instância chamada "Mutex", que é igual a "new mutex ()". O "novo" é uma palavra -chave para criar uma nova instância.
Em seguida, chame a função "principal" em nosso código C#. Nesta função "principal", temos um loop "para" usado para criar cinco threads diferentes. Como esse loop inicializa "a" com "1", a condição aqui é "um<=5” which means there are 5 iterations in the loop or the loop iterates 5 times and creacreatestiple threads. Each time the value of “a” increments when the loop executes and the condition is true. Then we create a Thread object with the name “threadObj” by using the “new” keyword. When this loop executes, it creates an object of the Thread. Now, we give the “name” to the “threadobj” which is equal to the value of “a”. It will store the name as “Thread” + a means the “Thread” and the value of “a” that “a” depends on the value of the loop iteration.
Então temos “Threadobj.Start () "em que" start () "é usado para alterar o estado do" Threadobj "para o estado de corrida. Fora deste loop "para", temos "console.Chave de leitura()". Isso usará para esperar por um presságio. Temos um método abaixo disso com o nome "DemOMutex", que é "estático". Usamos este método para implementar a sincronização usando o "mutex". O “console.WriteLine ”está aqui para imprimir a declaração escrita dentro dela. Depois deste “console.Declaração WriteLine ", usaremos o método" Try ".
Então, novamente, temos o “console.Declaração de WriteLine ”. Quando você vir a saída, ficará claro para você como esse “console.WriteLine ”imprime a declaração fornecida. O segmento.Sleep (2000) ”é para suspender ou fazer uma pausa na execução do fio atual por um tempo que é dado como um parâmetro aqui. Depois disso, usamos novamente o “console.Declaração de WriteLine ”. Usamos a palavra -chave "palavra -chave" para limpar os recursos que alocamos no bloco de tentativa ou a declaração dentro deste bloco "finalmente" executado quando a declaração de tentativa deixa o controle. Dentro da declaração "finalmente", chamaremos o método "ReleaseMutex", que é usado para desbloquear para que outro tópico inicie a execução que está tentando executar.
Também fornecemos a saída deste código na imagem abaixo. Você pode ver como esse código fornece a saída na tela. Compilamos nosso código com este comando e, quando o código estiver livre de erros, ele criará um arquivo exe para nós. Este arquivo "exe" é executado usando o comando "mono". E lembre -se de que, quando usamos este comando "mono", devemos usar o ".Extensão do arquivo exe ”com o nome do arquivo e depois execute este comando para obter a saída.
Nesta saída, você pode ver que, quando um thread deseja entrar na seção crítica, os outros threads também querem entrar, mas eles precisam esperar até que o primeiro thread conclua a execução porque usamos a função Mutex "wagone ()". Quando este tópico completa sua execução, o próximo thread entra e inicia sua execução e existe depois de concluir sua tarefa. Ele permite que o próximo tópico entre e inicie a execução. Os mesmos passos são repetidos até que a condição seja verdadeira.
Exemplo # 2
Aqui, temos outra ilustração usando o método mutex (). Vamos tentar este exemplo para entender este conceito.
As mesmas declarações usadas neste código C# são "usando sistema" e "sistema.Encadeamento ”. A classe é "Mutexprogram" e, na classe, criamos uma instância da classe Mutex com o nome "Mutex" usando a palavra -chave "nova" e depois chamando a função "principal" abaixo disso. O método wagone () tenta obter um bloqueio. Se o mutex não estiver disponível, então os blocos “wagone ()” e aguardam até que esteja disponível. Também especificamos um limite de tempo aqui. Se chamarmos o método wagone () no "objeto mutex" e o prazo passa sem poder adquirir o mutex, então wagone retorna false. Quando retornar false, a declaração escrita abaixo será executada: o “Console.Declaração de WriteLine ”. E esta afirmação é usada para impressão.
Se formos verdadeiros, vamos à seção de código executada, que é a função "run ()", e esta função é definida abaixo. Quando "run ()" termina, o bloco "finalmente" é executado, que libera o mutex usando "MutexRelease". Nós explicamos esse "mutexreLease" no código anterior. Definimos a função "run ()" aqui na qual vamos imprimir uma declaração usando "console.WriteLine () ”e, finalmente, temos o“ Console.Leia a linha()". Este “console.ReadLine ”está aqui para a leitura de cordas completas até que a tecla Enter seja pressionada.
A saída mostra apenas as declarações "run ()" porque retorna true e se move para o "run ()". Se executarmos isso no outro terminal simultaneamente, no outro terminal, ele mostrará a declaração que é escrita dentro da declaração IF, enquanto tenta obter o "Mutex", mas o "Mutex" já está no uso de outra aplicação , então tem que esperar o “mutex” liberar.
Conclusão
Este tutorial explora o "mutex" na programação C#. Demonstramos dois exemplos aqui e usamos este "mutex" para que você entenda este conceito. Esta classe "Mutex" nos fornecerá funções "wagone ()" e "realeasemutex ()". Este "wagone ()" é usado para bloqueio, e o "releaseMutex ()" é usado para desbloquear a tarefa ou tópico. Usamos os dois métodos em nossos exemplos e explicamos tudo isso em detalhes. Espero que você aprenda esse conceito "Mutex" após um estudo completo deste guia e também possa usar esta classe "Mutex" em seu projeto.