Sobes.tech
Junior — Middle

Mis on semafori mehhanismi eesmärk mitme lõime programmeerimisel?

sobes.tech AI

Vastus AI-lt

Mitme niidiga programmeerimises kasutatakse semaforit ühiste ressursside juurdepääsu juhtimiseks, piirates niitide arvu, mis saavad seda ressurssi samaaegselt kasutada. See hoiab kontot, mis väheneb, kui ressurss on haaratud, ja suureneb, kui see vabastatakse. Kui kontor on null, blokeeritakse uued niidid kuni ressurss vabastatakse.

Näide Go keeles, kasutades kanalit semaforina:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    sem := make(chan struct{}, 3) // semafor maksimaalse kontoga 3

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            sem <- struct{}{} // ressurss haaramine
            fmt.Printf("Goroutine %d hakkas tööle\n", id)
            // töö simulatsioon
            // time.Sleep(time.Second)
            fmt.Printf("Goroutine %d lõpetas töö\n", id)
            <-sem // ressurss vabastamine
        }(i)
    }

    wg.Wait()
}

Sellisel viisil aitab semafor kontrollida konkurentsivõimelist juurdepääsu ning ennetada võistlusolukordi ja ressursside ülekoormust.