Semáforos POSIX em C

Semaforos Posix Em C



“Embora toda linguagem de programação tenha muitas bibliotecas para propósitos específicos, a biblioteca POSIX de C tem seu lugar. Ele foi projetado para criar uma grande harmonização entre os processos e ajuda muito no uso de multithreading dentro dos programas, ou seja, criar vários threads e sincronizar sua execução. Neste guia de hoje, você verá uma ilustração simples do uso de semáforos POSIX em C. Para os exemplos básicos de código C, devemos configurar seu compilador no sistema. Mas, antes disso, precisamos atualizar o sistema, pois é uma etapa necessária para a execução suave do código. Assim, a consulta exibida no snap anexado é obrigatória para atualizar e atualizar seu sistema operacional Linux com o utilitário “apt”.


Esse processo exigia aproximadamente 55 Kb de espaço em sua plataforma Linux para realizar as atualizações sem problemas. Se você estiver disposto a dar tanto espaço, toque em “y” para continuar. O processamento será concluído em alguns minutos.








Após a atualização completa do sistema, vamos configurar o compilador da linguagem C em nosso sistema com o utilitário apt-get no comando “install”. Use “gcc” como palavra-chave e pronto.





sem_init()

Um semáforo novo seria criado quando já existe um semáforo não identificado em “s”; caso contrário, esse semáforo já existente será descartado. Ao longo deste método, “s” significa uma instância de Semaphore que foi construída, e shared é um sinal ou galhardete que indica se o semáforo pode ser distribuído com um método forked() ou não. O valor de entrada serve como ponto inicial definido do semáforo.





Int sem_init ( nor_t * s, int compartilhado, valor int não assinado ) ;

Sem_wait()

Ao executar uma ação de bloqueio de semáforo no semáforo especificado por “s”, o método sem_wait() mantém esse semáforo. O procedimento sem-wait será usado para reter um semáforo ou deixá-lo na fila. Alguns dos processos sobrecarregados anteriormente despertam quando algum outro processo invoca sem_post().



int sem_wait ( nor_t * s ) ;

no_post()

Quando sem post é chamado, o valor é aumentado e, em seguida, uma das operações com backup anterior ou em espera começa a ser executada, ou seja, desbloqueia o semáforo já bloqueado.

int sem_post ( nor_t * s ) ;

Sem_destroy()

Um semáforo sem nome “s” inicializado é destruído empregando a função sem destroy().

int sem_destroy ( nor_t * s ) ;

Exemplo

Para entender os semáforos, vamos primeiro criar um arquivo C e depois adicionar um código a ele. Para criar um, use a consulta “touch” e você encontrará o novo arquivo na pasta inicial do seu sistema.


Agora, você precisa abrir seu arquivo C vazio com algum editor simples para gerar um bom código nele. Temos tentado o editor “nano” até agora, como mostrado no snap abaixo.


Como todos sabemos, todas as linguagens de programação não podem funcionar sem bibliotecas, pois essas bibliotecas contêm um grande número de classes, estruturas, funções e objetos a serem utilizados para o funcionamento geral do sistema. Então estamos iniciando este programa em C com o uso de algumas bibliotecas básicas e obrigatórias para os Semáforos POSIX.

Para usar essas bibliotecas no código, temos que usar o caractere “#” com a palavra-chave “include” para cada biblioteca. No momento, adicionamos um total de 4 bibliotecas que são obrigatórias neste programa. Caso contrário, nosso programa não funcionará corretamente. A primeira biblioteca de cabeçalho “stdio.h” geralmente é obrigatória em todo programa C porque nos permite ter operações de entrada e saída no código. Portanto, estamos usando-o para adicionar entradas e obter saídas do código sem problemas. A segunda biblioteca que estamos usando aqui é a “pthread.h” que é obrigatória para o uso de programação de threads, ou seja, multithreading.

Estaremos usando esta biblioteca para criar threads em um programa. A próxima e mais importante biblioteca neste código é a “semaphore.h”. Ele foi utilizado para sincronizar suavemente os threads. Por último, mas não menos importante, a biblioteca é “unistd.h”, que nos permite usar funções e constantes diversas definidas pelo usuário. Agora, declaramos o semáforo “s” usando o objeto interno “sem_t” da biblioteca de semáforos. Aqui vem a função de thread definida pelo usuário “T” sem tipo de retorno. Ele vem utilizando algumas funções de semáforo integradas para realizar a sincronização. A função sem_wait() está aqui para manter o semáforo “s” usando o caractere “&”.

Dentro do hold, a instrução printf() foi executada junto com a função “sleep” para fazer este programa dormir por 4 segundos. Outra instrução printf() exibe uma nova mensagem e a função sem_post() é executada para liberar o bloqueio no semáforo “s”.

#include
#include
#include
#include
nem_t s;
vazio * T ( vazio * argumento ) {
sem_wait ( & s ) ;
printf ( 'Bem-vindo! \n ' ) ;
dorme ( 4 ) ;
printf ( 'Tchau! \n ' ) ;
sem_post ( & s ) ;
}



Vamos dar uma boa olhada no método main() deste programa C para semáforos. A função sem_init() foi utilizada aqui para criar um novo semáforo “s” que não foi distribuído com um método forked(), ou seja, “0”, e seu ponto inicial é definido como 1. O objeto pthread_t do pthread A biblioteca de C foi utilizada para criar dois threads usando dois objetos de thread, o1 e o2. A instrução printf() está aqui para mostrar que vamos criar o primeiro thread usando a função pthread_create() na próxima linha.

Estamos passando o objeto thread o1 para esta função com restrições NULL e chamando a função “T” passando-o nos parâmetros. Após uma suspensão de 4 segundos, outro thread foi criado com o objeto o2, e a função pthread_join() é utilizada aqui para unir os threads com uma função main(). A função sem_destroy() está aqui para destruir o semáforo “s”, e todas as threads bloqueadas também serão liberadas.

int principal ( ) {
sem_init ( & s, 0 , 1 ) ;
pthread_t o1, o2;
printf ( 'Em um 1º Tópico agora... \n ' ) ;
pthread_create ( & o1,NULO,T,NULO ) ;
dorme ( 4 ) ;
printf ( 'Em um segundo tópico agora... \n ' ) ;
pthread_create ( & o2,NULO,T,NULO ) ;
pthread_join ( o1,NULO ) ;
pthread_join ( o2,NULO ) ;
  sem_destroy ( & s ) ;
Retorna 0 ;
}



Estamos compilando o programa em C com o compilador “Gcc”; as opções “-lrt” e “-lpthread” são utilizadas para executar as funções de thread POSIX. Ao executar a consulta “.a/.out”, o primeiro thread foi criado. Ele vai dormir depois de imprimir a primeira mensagem.


O segundo thread foi sincronizado e, após 4 segundos, o primeiro thread foi liberado e o segundo thread foi bloqueado por 4 segundos.


No final, o segundo tópico também foi liberado.

Conclusão

É isso sobre os semáforos POSIX em C enquanto utiliza algumas de suas principais funções para sincronizar diferentes threads. Depois de ler este artigo, você poderá entender cada vez mais o POSIX.