Sobes.tech
Middle

Qu'est-ce qu'un sémaphore dans le contexte de la programmation?

sobes.tech IA

Réponse de l'IA

Un sémaphore est une primitive de synchronisation de threads qui contrôle l'accès à une ressource limitée. Il maintient un compteur entier.

Opérations principales :

  • wait() (ou P / acquire) : Diminue le compteur de 1. Si le compteur devient négatif, le thread est bloqué jusqu'à ce qu'un autre thread exécute signal().
  • signal() (ou V / release) : Augmente le compteur de 1. Si des threads sont bloqués, l'un d'eux est débloqué.

Types de sémaphores :

  • Sémaphore binaire (mutex) : Le compteur prend les valeurs 0 ou 1. Utilisé pour assurer une exclusion mutuelle : un seul thread peut accéder à la ressource à la fois.
  • Sémaphore compté : Le compteur peut prendre des valeurs de 0 à N. Utilisé pour gérer l'accès à un pool de ressources avec un nombre limité d'éléments disponibles.

Exemple d'utilisation en Swift pour limiter le nombre de tâches s'exécutant simultanément :

// Création d'un sémaphore permettant jusqu'à 3 accès simultanés
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Tâche 1
    semaphore.wait() // Diminue le compteur, bloque si > 3 tâches en cours
    print("Tâche 1 démarrée")
    Thread.sleep(forTimeInterval: 2) // Simulation de travail
    print("Tâche 1 terminée")
    semaphore.signal() // Augmente le compteur, débloque les tâches en attente
}

DispatchQueue.global().async {
    // Tâche 2
    semaphore.wait()
    print("Tâche 2 démarrée")
    Thread.sleep(forTimeInterval: 3)
    print("Tâche 2 terminée")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Tâche 3
    semaphore.wait()
    print("Tâche 3 démarrée")
    Thread.sleep(forTimeInterval: 1)
    print("Tâche 3 terminée")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Tâche 4 (attendra qu'une place se libère)
    semaphore.wait()
    print("Tâche 4 démarrée")
    Thread.sleep(forTimeInterval: 2)
    print("Tâche 4 terminée")
    semaphore.signal()
}

// Attendre que toutes les tâches soient terminées pour la démo
// En code réel, utiliser des mécanismes d'attente plus fiables
Thread.sleep(forTimeInterval: 5)