Sobes.tech
Junior — Middle

Care este scopul mecanismului semafor în programarea multi-thread?

sobes.tech AI

Răspuns de la AI

Un semafor în programarea multi-thread este utilizat pentru a gestiona accesul la resursele partajate, limitând numărul de fire de execuție care pot utiliza această resursă simultan. Acesta păstrează un contor care scade atunci când resursa este preluată și crește atunci când este eliberată. Dacă contorul este zero, firele noi sunt blocate până când resursa este eliberată.

Exemplu în Go folosind un canal ca semafor:

package main

import (
    "fmt"
    "sync"
)

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

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            sem <- struct{}{} // preluarea resursei
            fmt.Printf("Goroutine %d a început să lucreze\n", id)
            // simulare de lucru
            // time.Sleep(time.Second)
            fmt.Printf("Goroutine %d a terminat de lucrat\n", id)
            <-sem // eliberarea resursei
        }(i)
    }

    wg.Wait()
}

Astfel, semaforul ajută la controlul accesului concurent și previne condițiile de cursă și supraîncărcarea resurselor.