Sobes.tech
Junior — Middle

Explique ce qu'est un sémaphore et comment il est utilisé pour gérer la synchronisation des threads.

sobes.tech IA

Réponse de l'IA

Un sémaphore est une primitive de synchronisation utilisée pour contrôler l’accès à une ressource partagée par plusieurs threads.

Il contient un compteur indiquant combien de threads peuvent accéder à la ressource simultanément.

  • Si le compteur est supérieur à zéro, le thread peut entrer et diminuer le compteur de 1.
  • Si le compteur est égal à zéro, le thread se bloque et attend qu’un autre thread libère la ressource.

En C#, le sémaphore est représenté par la classe Semaphore ou SemaphoreSlim.

Exemple d’utilisation de SemaphoreSlim :

using System;
using System.Threading;

class Program
{
    static SemaphoreSlim semaphore = new SemaphoreSlim(2); // maximum 2 threads simultanément

    static void AccessResource(int id)
    {
        Console.WriteLine($"Thread {id} attend l’accès");
        semaphore.Wait(); // demande d’accès
        Console.WriteLine($"Thread {id} a obtenu l’accès");

        Thread.Sleep(1000); // simulation de travail avec la ressource

        Console.WriteLine($"Thread {id} libère la ressource");
        semaphore.Release(); // libération de la ressource
    }

    static void Main()
    {
        for (int i = 1; i <= 5; i++)
        {
            int localId = i;
            new Thread(() => AccessResource(localId)).Start();
        }
    }
}

Dans cet exemple, pas plus de deux threads peuvent travailler avec la ressource en même temps, les autres attendent leur tour.