Sobes.tech
Junior — Middle

Aký je účel mechanizmu semafora v viacvláknovom programovaní?

sobes.tech AI

Odpoveď od AI

Semafor v viacvláknovom programovaní sa používa na riadenie prístupu ku zdieľaným zdrojom, obmedzovaním počtu vlákien, ktoré môžu súčasne používať tento zdroj. Uchováva čítač, ktorý sa znižuje pri získaní zdroja a zvyšuje pri jeho uvoľnení. Ak je čítač nulový, nové vlákna sú blokované, kým sa zdroj neuvoľní.

Príklad v Go s použitím kanála ako semaforu:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    sem := make(chan struct{}, 3) // semafor s maximálnym čítačom 3

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            sem <- struct{}{} // získanie zdroja
            fmt.Printf("Goroutine %d začala pracovať\n", id)
            // simulácia práce
            // time.Sleep(time.Second)
            fmt.Printf("Goroutine %d ukončila prácu\n", id)
            <-sem // uvoľnenie zdroja
        }(i)
    }

    wg.Wait()
}

Týmto spôsobom semafor pomáha kontrolovať súbežný prístup a zabraňuje podmienkam súťaže a preťaženiu zdrojov.