Sobes.tech
Junior — Middle

Pouvez-vous expliquer ce qu'est un sémaphore et comment il est utilisé pour contrôler l'accès aux ressources?

sobes.tech IA

Réponse de l'IA

Un sémaphore est un mécanisme de synchronisation utilisé pour contrôler l'accès à une ressource partagée dans des applications multithread. Il contient un compteur qui indique combien de threads peuvent accéder à la ressource simultanément.

Principe de fonctionnement :

  • Initialement, le compteur est réglé sur le nombre de ressources disponibles (par exemple, 3).
  • Lorsqu'un thread souhaite accéder, il appelle l'opération Wait (ou WaitOne en C#), qui diminue le compteur de 1.
  • Si le compteur devient inférieur à zéro, le thread est bloqué et attend que la ressource soit libérée.
  • Lorsqu'un thread libère la ressource, il appelle Release, augmentant le compteur et déverrouillant les threads en attente.

Exemple en C# :

using System;
using System.Threading;

class Program
{
    static Semaphore semaphore = new Semaphore(3, 3); // maximum 3 threads simultanément

    static void AccessResource(int id)
    {
        Console.WriteLine($"Thread {id} attend l'accès");
        semaphore.WaitOne(); // demande d'accès
        Console.WriteLine($"Thread {id} a obtenu l'accès");
        Thread.Sleep(1000); // 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();
        }
    }
}

Ainsi, le sémaphore limite le nombre de threads travaillant simultanément avec la ressource, évitant les conditions de course et assurant un fonctionnement correct.