Quelle est la différence entre un sémaphore et un mutex?
sobes.tech IA
Réponse de l'IA
Un mutex (Mutual Exclusion) est un mécanisme de synchronisation qui garantit qu’à un moment donné, un seul thread a accès à la section critique du code ou à une ressource. Il fonctionne selon le principe de propriété : le thread qui bloque le mutex doit le débloquer.
Un sémaphore (Semaphore) est un mécanisme de synchronisation plus général qui contrôle l’accès à une ressource limitée par un certain nombre de "permis". Les threads peuvent obtenir un permis si disponible et continuer l’exécution. Lorsque la ressource n’est plus nécessaire, le permis est rendu. Le sémaphore n’a pas de concept de propriété ; n’importe quel thread peut augmenter le compteur du sémaphore.
Différences clés :
- Objectif : Le mutex est utilisé pour un accès exclusif (un thread), le sémaphore pour gérer l’accès à un pool limité de ressources (plusieurs threads jusqu’à la limite).
- Propriété : Le mutex a un propriétaire (le thread qui l’a bloqué). Le sémaphore n’a pas de propriétaire.
- Compteur : Le mutex peut être considéré comme un sémaphore avec un compteur égal à 1. Le sémaphore peut avoir un compteur supérieur à 1.
- Opérations : Mutex :
WaitOne/Pulse/ReleaseMutex. Sémaphore :WaitOne/Release.
Voici un exemple simple d’utilisation d’un sémaphore en C# :
// Création d’un sémaphore avec une valeur initiale de 2 et un maximum de 2.
// Permet à 2 threads d’accéder simultanément à la ressource.
SemaphoreSlim semaphore = new SemaphoreSlim(2, 2);
// Le thread tente d’accéder à la ressource
semaphore.WaitOne();
// ... travail avec la ressource ...
semaphore.Release(); // Libération du permis
Exemple de mutex :
// Création d’un mutex
Mutex mutex = new Mutex();
// Le thread tente d’obtenir un accès exclusif
mutex.WaitOne();
// ... travail avec la section critique ...
mutex.ReleaseMutex(); // Libération du mutex (seul le propriétaire peut)