Junior — Middle
Quelle est la fonction du mécanisme de sémaphore en programmation multithread ?
sobes.tech IA
Réponse de l'IA
Un sémaphore en programmation multithread est utilisé pour gérer l'accès aux ressources partagées, en limitant le nombre de threads pouvant utiliser cette ressource simultanément. Il maintient un compteur qui diminue lors de la prise de la ressource et augmente lors de sa libération. Si le compteur est zéro, les nouveaux threads sont bloqués jusqu'à ce que la ressource soit libérée.
Exemple en Go utilisant un canal comme sémaphore:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
sem := make(chan struct{}, 3) // sémaphore avec un compteur maximum de 3
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
sem <- struct{}{} // acquisition de la ressource
fmt.Printf("Goroutine %d a commencé\n", id)
// simulation de travail
// time.Sleep(time.Second)
fmt.Printf("Goroutine %d a terminé\n", id)
<-sem // libération de la ressource
}(i)
}
wg.Wait()
}
Ainsi, le sémaphore aide à contrôler l'accès concurrent et à prévenir les conditions de course et la surcharge des ressources.