Mutex vs Semaphore
O semáforo é uma estrutura de dados 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 paralelos. Semáforos são usados para evitar bloqueios e condições de corrida. O Mutex (Objeto de Exclusão Mútua) 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?
O semáforo é uma estrutura de dados usada para fornecer exclusão mútua a seções críticas. Os semáforos suportam principalmente duas operações chamadas espera (historicamente conhecida como P) e sinal (historicamente conhecida como V). A operação de espera bloqueia um processo até que o semáforo seja aberto e a operação de sinal permite que outro processo (thread) entre. 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 for fechado quando a operação de espera for chamada por um encadeamento, o encadeamento será bloqueado e terá que aguardar na fila. A operação do sinal abre um semáforo e, se já houver um encadeamento aguardando na fila, esse processo poderá continuar e se não houver encadeamentos aguardando na fila, o sinal será lembrado para os próximos encadeamentos. Existem dois tipos de semáforos chamados semáforos mutex e semáforos contadores. Os semáforos Mutex permitem um único acesso a um recurso e os semáforos contadores permitem que vários threads acessem um recurso (que possui 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 thread, ele é bloqueado e outros threads não podem usá-lo. Se outro encadeamento quiser usar o mesmo recurso, ele precisará fazer uma solicitação. Em seguida, esse segmento será colocado em uma fila até o primeiro segmento terminar com o recurso. Quando o primeiro encadeamento terminar com o recurso, o bloqueio será removido e o encadeamento que está aguardando na fila poderá obter acesso ao recurso. Se houver vários encadeamentos aguardando na fila, eles terão acesso rotativamente. Praticamente, quando o mutex alterna o acesso a um recurso entre vários encadeamentos, ele fica visível quando vários encadeamentos estão consumindo um recurso ao mesmo tempo. Mas internamente, apenas um único encadeamento está acessando o recurso em um determinado momento.
Qual é a diferença entre Semaphore e Mutex?
Mesmo assim, os semáforos e os objetos mutex são usados para obter exclusão mútua em ambientes de programação paralelos, 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, outros encadeamentos que desejam acessar o recurso precisam aguardar em uma fila, até que o encadeamento atual seja concluído usando o recurso.