Qual é a diferença entre um semáforo e um mutex?
sobes.tech IA
Resposta da IA
O mutex (Mutual Exclusion) é um mecanismo de sincronização que garante que, num dado momento, apenas um thread tenha acesso à secção crítica do código ou recurso. Funciona com base no princípio de propriedade: o thread que bloqueou o mutex deve libertá-lo.
O semáforo (Semaphore) é um mecanismo de sincronização mais geral que controla o acesso a um recurso limitado por um determinado número de "permissões". Os threads podem obter permissão se estiver disponível e continuar a execução. Quando o recurso já não é necessário, a permissão é devolvida. O semáforo não tem conceito de propriedade; qualquer thread pode aumentar o contador do semáforo.
Diferenças principais:
- Propósito: O mutex é usado para acesso exclusivo (um thread), o semáforo para gerir o acesso a um conjunto limitado de recursos (vários threads até ao limite).
- Propriedade: O mutex tem um proprietário (o thread que o bloqueou). O semáforo não tem proprietário.
- Contador: O mutex pode ser considerado como um semáforo com um contador igual a 1. O semáforo pode ter um contador superior a 1.
- Operações: Mutex:
WaitOne/Pulse/ReleaseMutex. Semáforo:WaitOne/Release.
Aqui está um exemplo simples de uso de semáforo em C#:
// Criar um semáforo com valor inicial 2 e máximo 2.
// Permite que até 2 threads acedam ao recurso simultaneamente.
SemaphoreSlim semaphore = new SemaphoreSlim(2, 2);
// O thread tenta aceder ao recurso
semaphore.WaitOne();
// ... trabalho com o recurso ...
semaphore.Release(); // Libertar permissão
Exemplo de mutex:
// Criar um mutex
Mutex mutex = new Mutex();
// O thread tenta obter acesso exclusivo
mutex.WaitOne();
// ... trabalho com a secção crítica ...
mutex.ReleaseMutex(); // Libertar o mutex (apenas o proprietário pode)