Sobes.tech
Junior

Quelle est la différence entre un mutex et un sémaphore?

sobes.tech IA

Réponse de l'IA

Un mutex est un sémaphore binaire qui est soit libre (valeur 1), soit occupé (valeur 0). Il est utilisé pour protéger les sections critiques et assurer un accès exclusif à une ressource. Seul le thread qui a acquis le mutex peut le libérer.

Un sémaphore est une généralisation du mutex, représentant un compteur. Il peut prendre des valeurs non négatives et est utilisé pour gérer l'accès à un nombre limité de ressources. Un thread peut acquérir un sémaphore si le compteur est supérieur à zéro (le décrémentant), et le libérer (en l'incrémentant). Un sémaphore peut être libéré par un autre thread, pas nécessairement celui qui l'a acquis.

Principales différences:

  • But: Mutex pour protéger les sections critiques, Sémaphore pour gérer l'accès aux ressources.
  • Valeur: Mutex (0 ou 1), Sémaphore (tout nombre non négatif).
  • Propriété: Mutex a un propriétaire (le thread qui l'a acquis), Sémaphore n'a pas de concept clair de propriété.
  • Qui peut le libérer: Seul le propriétaire peut le faire dans le mutex, tout thread peut le faire dans le sémaphore.
#include <mutex> // Pour std::mutex
#include <semaphore> // Pour std::counting_semaphore

std::mutex mtx; // Mutex pour protéger la ressource

void critical_section() {
    mtx.lock(); // Acquisition du mutex
    // Accès à la ressource partagée
    mtx.unlock(); // Libération du mutex
}

// Sémaphore pour gérer l'accès à 5 ressources
std::counting_semaphore<5> sem(5);

void access_resource() {
    sem.acquire(); // Acquisition de la ressource (décroît le compteur)
    // Utilisation de la ressource
    sem.release(); // Libération de la ressource (augmente le compteur)
}

Comparaison en tableau:

Caractéristique Mutex Sémaphore
Type Objet de synchronisation (sémaphore binaire) Objet de synchronisation (compteur)
Valeur 0 (occupé), 1 (libre) Nombre non négatif
But Protection des sections critiques, exclusion mutuelle Gestion de l'accès aux ressources limitées
Propriété A un propriétaire (le thread qui l'a acquis) N'a pas de concept clair de propriété
Qui peut le libérer Seul le propriétaire Tout thread