Quelle est la différence entre mutex, sémaphore et lock?
sobes.tech IA
Réponse de l'IA
lock en C# est un sucre syntaxique pour utiliser Monitor.Enter et Monitor.Exit, enveloppés dans un bloc try-finally pour garantir la libération du verrou. Il fournit un accès exclusif à une ressource pour un seul thread. En substance, c'est le primitive de synchronisation le plus simple au niveau de l'objet.
Mutex est une primitive de synchronisation qui peut être utilisée pour fournir un accès exclusif à une ressource pour un seul thread de plusieurs processus. Il a une notion de propriété du thread : seul le thread qui a obtenu le mutex peut le libérer.
Semaphore est une primitive de synchronisation qui limite le nombre de threads pouvant accéder à une ressource simultanément. Il possède un compteur qui diminue lors de l'obtention de l'accès et augmente lors de sa libération.
Les principales différences sont présentées dans le tableau :
| Caractéristique | lock (Monitor) |
Mutex |
Semaphore |
|---|---|---|---|
| Portée de visibilité | Au sein d'un seul processus | Entre processus | Entre processus |
| Nombre de threads | Un seul | Un seul (propriétaire) | Nombre limité |
| Propriété | Lié au thread | Lié au thread | Non lié au thread |
| Utilisation | Synchronisation simple | Synchronisation entre processus, mutex nommés | Limitation de l'accès parallèle à une ressource |
| Exceptions | Ne nécessite pas de gestion explicite d'AbandonedMutexException | Nécessite la gestion d'AbandonedMutexException | Pas d'AbandonedSemaphoreException |
// Exemple d'utilisation de lock
private readonly object _lockObject = new object();
public void DoSomethingWithLock()
{
lock (_lockObject)
{
// Section critique
}
}
// Exemple d'utilisation de Mutex
using System.Threading;
private Mutex _mutex = new Mutex();
public void DoSomethingWithMutex()
{
_mutex.WaitOne(); // Obtenir le mutex
try
{
// Section critique
}
finally
{
_mutex.ReleaseMutex(); // Libérer le mutex
}
}
// Exemple d'utilisation de Semaphore
using System.Threading;
private Semaphore _semaphore = new Semaphore(3, 3); // Permet 3 threads simultanément
public void DoSomethingWithSemaphore()
{
_semaphore.WaitOne(); // Obtenir "l'accès" au sémaphore
try
{
// Section critique, accès limité à 3 threads
}
finally
{
_semaphore.Release(); // Libérer "l'accès"
}
}