Junior — Middle
Kokia yra semaforo mechanizmo paskirtis daugiagijų programavime?
sobes.tech AI
Atsakymas iš AI
Semaforas daugiabriauniame programavime naudojamas valdyti prieigą prie bendrų išteklių, apribodamas tų gijų skaičių, kurios gali naudoti šį išteklių vienu metu. Jis saugo skaitiklį, kuris sumažėja, kai išteklius įgyjamas, ir padidėja, kai jis atlaisvinamas. Jei skaitiklis yra lygus nuliui, naujos gijos yra blokuojamos, kol išteklius nebus atlaisvintas.
Pavyzdys Go kalba, naudojant kanalą kaip semaforą:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
sem := make(chan struct{}, 3) // semaforas su maksimaliu skaitikliu 3
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
sem <- struct{}{} // išteklių įgijimas
fmt.Printf("Goroutine %d pradėjo darbą\n", id)
// darbo simuliacija
// time.Sleep(time.Second)
fmt.Printf("Goroutine %d baigė darbą\n", id)
<-sem // išteklių atlaisvinimas
}(i)
}
wg.Wait()
}
Šiuo būdu semaforas padeda kontroliuoti konkurencingą prieigą ir išvengti lenktynių sąlygų bei išteklių perkrovos.