Junior — Middle
Care este scopul mecanismului semafor în programarea multi-thread?
sobes.tech AI
Răspuns de la AI
Un semafor în programarea multi-thread este utilizat pentru a gestiona accesul la resursele partajate, limitând numărul de fire de execuție care pot utiliza această resursă simultan. Acesta păstrează un contor care scade atunci când resursa este preluată și crește atunci când este eliberată. Dacă contorul este zero, firele noi sunt blocate până când resursa este eliberată.
Exemplu în Go folosind un canal ca semafor:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
sem := make(chan struct{}, 3) // semafor cu contor maxim 3
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
sem <- struct{}{} // preluarea resursei
fmt.Printf("Goroutine %d a început să lucreze\n", id)
// simulare de lucru
// time.Sleep(time.Second)
fmt.Printf("Goroutine %d a terminat de lucrat\n", id)
<-sem // eliberarea resursei
}(i)
}
wg.Wait()
}
Astfel, semaforul ajută la controlul accesului concurent și previne condițiile de cursă și supraîncărcarea resurselor.