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()(ouP/acquire) : Diminue le compteur de 1. Si le compteur devient négatif, le thread est bloqué jusqu'à ce qu'un autre thread exécutesignal().signal()(ouV/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)