Sobes.tech
Junior — Middle

Jaký je účel mechanismu semaforu v vícenásobném programování?

sobes.tech AI

Odpověď od AI

Semafor v vícevláknovém programování se používá k řízení přístupu ke sdíleným zdrojům tím, že omezuje počet vláken, která mohou současně tento zdroj používat. Uchovává čítač, který se snižuje při získání zdroje a zvyšuje při jeho uvolnění. Pokud je čítač nulový, nová vlákna jsou blokována, dokud není zdroj uvolněn.

Příklad v Go s použitím kanálu jako semaforu:

package main

import (
    "fmt"
    "sync"
)

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

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            sem <- struct{}{} // získání zdroje
            fmt.Printf("Goroutine %d začala pracovat\n", id)
            // simulace práce
            // time.Sleep(time.Second)
            fmt.Printf("Goroutine %d dokončila práci\n", id)
            <-sem // uvolnění zdroje
        }(i)
    }

    wg.Wait()
}

Tímto způsobem semafor pomáhá kontrolovat konkurenční přístup a předcházet závodním podmínkám a přetížení zdrojů.