Sobes.tech
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.