O semáforo é uma variável que fica associada a um recurso compartilhado, indicando quando este está sendo acessado por um outro processo. Ela terá seu valor alterado quando o processo entra e quando sai da região crítica de forma que se um outro processo entrar em sua região critica ele possa checar antes este valor para saber se o recurso esta ou não disponível. Quando o processo tiver seu acesso impedido, ele será colocado em uma fila de espera associada ao semáforo aguardando sua vez de utilizar o recurso. Todos os processos da fila terão acesso ao recurso na ordem de chegada. O semáforo pode ser usado também para implementar sincronizações condicionais. Isto consiste em um processo que necessita ser notificado sobre a ocorrência de um evento. Pode-se usar o semáforo para notificar este processo sobre a ocorrência deste evento.
Outro tipo de semáforo usado é SEMÁFORO CONSUMIDOR onde ele pode informar ao processo se o buffer está cheio ou está vazio.
SEMÁFORO CONTADOR é aquele que notifica os processos sobre o uso dos recursos. Sempre que um processo usa um recurso qualquer, este semáforo é incrementado e sempre que um processo liberar um recurso ele será decrementado. Este semáforo é útil para evitar que um processo entre na região crítica sem que hajam recursos disponíveis no sistema.
Passos para se implementar um semáforo em C/C++ (Posix)
Incluir o header da biblioteca semaphore.
Outro tipo de semáforo usado é SEMÁFORO CONSUMIDOR onde ele pode informar ao processo se o buffer está cheio ou está vazio.
SEMÁFORO CONTADOR é aquele que notifica os processos sobre o uso dos recursos. Sempre que um processo usa um recurso qualquer, este semáforo é incrementado e sempre que um processo liberar um recurso ele será decrementado. Este semáforo é útil para evitar que um processo entre na região crítica sem que hajam recursos disponíveis no sistema.
Passos para se implementar um semáforo em C/C++ (Posix)
Incluir o header da biblioteca semaphore.
#include <semaphore.h>
Criar o semáforo, neste exemplo chamado de teste;
sem_t teste;
Inicialização do semáforo
sem_init(&teste, 0, 0);
Função para (decrementar/aguardar)
sem_wait(&teste);
Função para (incrementar/liberar)
sem_post(&teste);
função para apagar o semáforo após a utilização
sem_destroy(&teste);
A funcionamento do semáforo é bastante simples de ser compreendida, se wait = 0 ele bloqueia, senão, libera o acesso. Quem estiver acessando, ou seja pegou o wait = 1, entra na região crítica e bloqueia, deixando wait =0, ao sair do processo, libera incrementando o valor de wait = 0 para 1 , utilizando post.
Exemplo:
void thread1() void thread2()
{ {
sem_wait(&teste); sem_wait(&teste);
regiao_critica; regiao_critica;
sem_post(&teste); sem_post(&teste);
} {
3 comentários:
Simples e útil, ajudou um palmeirense.Valeu....
OLAAA Como
Estou implementando esse algotimo e outros de exclusão mutua.
Minha pergunta é: Uso compilador codeBlocks como faço para incluir esta biblioteca nele ???? usei Google mas não sanou monha duvida.
Obrigado!!!
Eu nunca utilizei o codeblocks, mas acredito que é da mesma maneira que se faz no linux incluindo o header semaphore.h, mas você tem que verificar se tem ela instalada.
no linux fica em: /usr/include/semaphore.h
da uma investigada onde fica esses header no windows.
Postar um comentário