Sobes.tech
Middle+

Qu'est-ce qu'un primitive de synchronisation Semaphore?

sobes.tech IA

Réponse de l'IA

Semaphore — c'est un primitive de synchronisation qui contrôle l'accès à un pool limité de ressources. Il maintient un compteur qui détermine combien de threads peuvent accéder simultanément à la ressource.

Opérations principales:

  • WaitOne (ou WaitAsync pour le code asynchrone): Diminue le compteur s'il est supérieur à zéro. Si le compteur est zéro, le thread est bloqué jusqu'à ce que le compteur devienne positif (un autre thread appelle Release).
  • Release: Incrémente le compteur et peut déverrouiller le thread en attente.

Types de Semaphore:

  • Semaphore: Système (avec ou sans nom), peut être utilisé entre processus.
  • SemaphoreSlim: Implémentation légère, conçue pour une utilisation à l'intérieur d'un processus. Préférée pour la synchronisation intra-processus.

Exemple d'utilisation de SemaphoreSlim:

// semaphoreSlim peut être utilisé pour limiter l'accès simultané à une ressource
// Dans ce cas, 2 threads sont autorisés en même temps
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Attend la libération du sémaphore
    await semaphoreSlim.WaitAsync();
    try
    {
        // Accès à la ressource limitée
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} accédant à la ressource");
        await Task.Delay(1000); // Simulation de travail avec la ressource
    }
    finally
    {
        // Libère le sémaphore
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} libérant la ressource");
        semaphoreSlim.Release();
    }
}