Sobes.tech
Junior

Qual é a diferença entre um mutex e um semáforo?

sobes.tech IA

Resposta da IA

O mutex é um semáforo binário que está livre (valor 1) ou ocupado (valor 0). É usado para proteger secções críticas e garantir acesso exclusivo a um recurso. Apenas o thread que adquiriu o mutex pode libertá-lo.

O semáforo é uma generalização do mutex, representando um contador. Pode assumir valores não negativos e é usado para gerir o acesso a um número limitado de recursos. Um thread pode adquirir um semáforo se o contador for maior que zero (diminuindo-o), e libertá-lo (aumentando o contador). Um semáforo pode ser libertado por outro thread, não necessariamente aquele que o adquiriu.

Principais diferenças:

  • Propósito: Mutex para proteger secções críticas, Semáforo para gerir o acesso a recursos.
  • Valor: Mutex (0 ou 1), Semáforo (qualquer número não negativo).
  • Propriedade: Mutex tem um proprietário (o thread que o adquiriu), Semáforo não tem um conceito claro de propriedade.
  • Quem pode libertá-lo: Apenas o proprietário pode libertá-lo no mutex, qualquer thread pode libertá-lo no semáforo.
#include <mutex> // Para std::mutex
#include <semaphore> // Para std::counting_semaphore

std::mutex mtx; // Mutex para proteger recurso

void critical_section() {
    mtx.lock(); // Adquirir mutex
    // Acesso ao recurso compartilhado
    mtx.unlock(); // Libertar mutex
}

// Semáforo para gerir acesso a 5 recursos
std::counting_semaphore<5> sem(5);

void access_resource() {
    sem.acquire(); // Adquirir recurso (diminuir o contador)
    // Uso do recurso
    sem.release(); // Libertar recurso (aumentar o contador)
}

Comparação em tabela:

Característica Mutex Semáforo
Tipo Objeto de sincronização (semáforo binário) Objeto de sincronização (contador)
Valor 0 (ocupado), 1 (livre) Número não negativo
Propósito Proteção de secções críticas, exclusão mútua Gestão de acesso a recursos limitados
Propriedade Tem proprietário (o thread que o adquiriu) Não tem um conceito claro de propriedade
Quem pode libertá-lo Apenas o proprietário Qualquer thread