C pthread_mutex_lock Uso da função

C pthread_mutex_lock Uso da função
Como o nome sugere a função "pthread_mutex_lock" deve ser usada para bloquear algo. A biblioteca POSIX de C criou esta função para bloquear um tópico específico que pode ser usado como um recurso compartilhado para alguma outra função em um programa. É necessário evitar o impasse durante a execução quando duas ou mais funções estão usando o mesmo tópico que seu recurso para conclusão de execução. Portanto, discutiremos o uso da função “pthread_mutex_lock” da biblioteca C Posix no Ubuntu 20.04 Sistema.

Exemplo 01:

Vamos começar com o primeiro exemplo para ver a função mutex_lock () do POSIX no código C. Começamos com a criação de arquivos com a instrução "Touch" do Ubuntu em sua concha. Este arquivo recém -gerado pode ser encontrado em sua pasta home linux. Para adicionar o código neste arquivo, você deve abri -lo dentro de algum editor do Ubuntu i.e., texto, nano ou vim. Estamos usando o editor de nano aqui para nossa criação de código. Ambos os comandos estão listados na imagem.

Estamos iniciando nosso código C com alguns cabeçalhos C. Esses pacotes de cabeçalho incluem o uso de entrada de entrada padrão para código, bibliotecas padrão, cabeçalhos de string e biblioteca de threads POSIX. Inicializamos um objeto de thread posix “th” do tamanho 3 i.e. ele criará apenas 3 tópicos usando IDs.

Depois disso, as variáveis ​​do tipo inteiro são declaradas eu.e., "Eu" e Conte ". A variável "i" é inicializada para 0. Aí vem a variável pthread_mutex_t para declarar o "bloqueio" para um tópico. Embora a execução seja iniciada no método principal (), temos que olhar para a função do thread primeiro. Esta função é chamada de seção crítica do nosso código devido à função "mutex_lock". No início da função do thread, a função pthread_mutex_lock está utilizando a variável de bloqueio para bloquear o segmento específico usando seu "id" passado pelo método da função principal () pthread_create ().

Agora, nenhum outro tópico pode usar este tópico até que este tópico seja desbloqueado. Então, continuará a processar. A variável de tipo longo "i" é inicializado para 0 para uso no loop "for". A variável "contagem" foi incrementada por 1. A variável de contagem é usada na declaração de impressão para nos informar que o "Thread1" é iniciado agora. Para "Loop", será inicializado aqui para dar um momento de intervalo à execução do tópico. Depois disso, a declaração de impressão nos informará que o tópico 1 será concluído.

A função pthread_mutex_unlock () é utilizada em oposição à função pthread_mutex_lock () para desbloquear o thread número 1. O controle vai para o método principal (). A função Main () continua a criar a função de encadeamento até que a contagem atinja 3. Aí vem a virada do método main () após 3 fios, tração, trava, desbloqueio e saída.

A função principal () é inicializada com uma variável inteira "err". A instrução "se" é usada aqui para verificar se a inicialização do thread mutex "l" falhou usando a função "pthread_mutex_init ()" do POSIX's. Se a inicialização falhar, ele imprimirá a mensagem específica da declaração de impressão. O loop "while" está aqui para ver a condição que eu.e. "Eu" menos de 3. Ele confirmará que o valor de "i" é menor que 3 e, portanto, continuará criando um tópico. Cada fio será bloqueado quando é chamado e nenhum outro tópico pode ser criado até então.

Se recebermos um erro no thread, exibiremos esse erro no shell convertendo -o em string usando o método "strerror". A função pthread_join () é usada para retomar todos os recursos dados aos threads. Em último. Nosso programa termina aqui.

O arquivo foi compilado e não temos erros. Na execução, a função principal () iniciou e criou um thread 1.

Depois de um tempo, devido ao bloqueio, o Thread 1 completou sua execução e terminou. Depois disso, a função principal () criou o thread 2 e foi iniciado.

Depois que o thread 2 é completamente executado, o bloqueio foi encerrado e a função principal () criou um último tópico i.e., 3rd fio.

Depois que o terceiro tópico é executado completamente, o bloqueio é liberado e o controle é devolvido ao método principal.

Exemplo 02:

Vamos ter outro exemplo para ver o funcionamento da função "pthread_mutex_lock ()" do Posix's. O código foi iniciado com os mesmos arquivos de cabeçalho.

Após os arquivos do cabeçalho, criamos uma função de bloqueio mutex. Lá vem três funções. Duas funções de thread e 1 é a função vinculada. Thread1 e Thread2 estão recebendo a entrada da função principal () i.e. Objetos de thread th1 e Th2. Ambas as funções de thread estão chamando o método show () e passando duas cordas em seu parâmetro. Quando a função "show" começa, ela se trava com o uso da função "pthread_mutex_lock ()" utilizando o objeto de bloqueio mutex. A primeira declaração de impressão está assumindo o primeiro argumento e a exibe. Então, ele dorme por 1 segundo, e o segundo valor de argumento será exibido através da cláusula de impressão. Na última linha, o bloqueio foi liberado usando a função "Pthread_mutex_unlock ()" utilizando o objeto de bloqueio.

A função principal () é iniciada com a criação de dois objetos para threads i.e. Th1 e Th2. Dois threads foram criados pela função "pthread_create", passando Th1 e Th2 nos parâmetros. O loop "while" é usado para correr e não terminar por um segundo. Então, o programa continua a se processar.

O código foi compilado primeiro com a ajuda do compilador "GCC" no Ubuntu 20.04.

Quando o código foi executado, Mostrar () Método chamado usando Thread1 e Thread2 Função um após o outro. O programa não parou depois que os tópicos são executados. Então, temos que parar a execução com força usando o atalho "Ctrl+Z".

Para impedir que seu sistema faça processamento ininterrupto, precisamos remover o loop "while" do código no método principal (). A frase de retorno 0 foi substituída pelo loop "while".

Agora, este programa está pronto para ser compilado e executado. Então, nós compilamos este programa com um compilador "GCC". Depois disso, a execução ocorreu. Você pode ver que o programa terminou após a execução de dois threads. O Thread1 funcionou e a função SHOW () se bloqueou durante a execução. Após a execução, ele se lançou e o Thread2 foi executado. A função "show" é chamada dentro dela e passou alguns parâmetros. A função "show ()" se bloqueou e não foi liberada até que a execução tenha sido feita e a função mutex_lock não seja chamada. Depois disso, o controle é devolvido ao método main () e o programa termina.

Conclusão

Isso foi tudo sobre o que podemos fazer para fazer você entender o uso da função pthread_mutex_lock no código C. Tivemos dois programas extremamente diferentes para torná -lo compreensível para você e explicamos os dois exemplos de maneira breve e simplesmente. Estamos bastante otimistas de que este artigo será ótimo para cada usuário C.