Semáforo vs Mutex
Semaphore é uma estrutura de dados que é usada para garantir que vários processos não acessem um recurso comum ou uma seção crítica ao mesmo tempo, em ambientes de programação paralela. Semáforos são usados para evitar dead locks e condições de corrida. Mutex (Mutual Exclusion Object) também é usado para evitar o acesso a um recurso comum ao mesmo tempo por vários processos simultâneos.
O que é um semáforo?
Semaphore é uma estrutura de dados que é usada para fornecer exclusão mútua para seções críticas. Os semáforos suportam principalmente duas operações chamadas wait (historicamente conhecido como P) e sinal (historicamente conhecido como V). A operação de espera bloqueia um processo até que o semáforo seja aberto e a operação de sinal permita a entrada de outro processo (thread). Cada semáforo está associado a uma fila de processos em espera. Quando a operação de espera é chamada por um encadeamento, se o semáforo estiver aberto, o encadeamento pode continuar. Se o semáforo é fechado quando a operação de espera é chamada por uma thread, a thread é bloqueada e tem que esperar na fila. A operação de sinal abre um semáforo e se já houver uma thread esperando na fila, esse processo tem permissão para prosseguir e se não houver threads esperando na fila o sinal é lembrado para as próximas threads. Existem dois tipos de semáforos chamados semáforos mutex e semáforos de contagem. Semáforos mutex permitem um único acesso a um recurso e semáforos de contagem permitem que várias threads acessem um recurso (que tem várias unidades disponíveis).
O que é um Mutex?
Quando um aplicativo de computador é iniciado, ele cria um mutex e o anexa a um recurso. Quando o recurso é usado por um encadeamento, ele é bloqueado e outros encadeamentos não podem usá-lo. Se outro thread quiser usar o mesmo recurso, ele terá que fazer uma solicitação. Em seguida, esse encadeamento será colocado em uma fila até que o primeiro encadeamento seja concluído com o recurso. Quando o primeiro encadeamento terminar com o recurso, o bloqueio será removido e o encadeamento que estiver aguardando na fila poderá obter acesso ao recurso. Se houver vários encadeamentos esperando na fila, eles receberão acesso de forma rotativa. Praticamente, quando o mutex alterna o acesso a um recurso entre várias threads, ele ficará visível, pois várias threads estão consumindo um recurso ao mesmo tempo. Mas internamente apenas um único thread está acessando o recurso em um determinado momento.
Qual é a diferença entre Semáforo e Mutex?
Mesmo assim, tanto os semáforos quanto os objetos mutex são usados para alcançar a exclusão mútua em ambientes de programação paralela, eles têm algumas diferenças. Um objeto mutex permite apenas que um único thread consuma um recurso ou uma seção crítica, enquanto os semáforos permitem um número restrito de acessos simultâneos a um recurso (abaixo de um número máximo permitido). Com objetos mutex, outras threads que desejam acessar o recurso precisam esperar em uma fila, até que a thread atual termine de usar o recurso.