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 |