Sobes.tech
Middle

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)