Sobes.tech
Junior — Middle

Jaki jest cel mechanizmu semafora w programowaniu wielowątkowym?

sobes.tech AI

Odpowiedź od AI

Semafor w programowaniu wielowątkowym jest używany do zarządzania dostępem do zasobów współdzielonych, ograniczając liczbę wątków, które mogą jednocześnie korzystać z tego zasobu. Przechowuje licznik, który zmniejsza się podczas przejęcia zasobu i zwiększa podczas jego zwolnienia. Jeśli licznik jest równy zero, nowe wątki są blokowane do czasu zwolnienia zasobu.

Przykład w Go z użyciem kanału jako semafora:

package main

import (
    "fmt"
    "sync"
)

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

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            sem <- struct{}{} // przejęcie zasobu
            fmt.Printf("Goroutine %d rozpoczęła pracę\n", id)
            // symulacja pracy
            // time.Sleep(time.Second)
            fmt.Printf("Goroutine %d zakończyła pracę\n", id)
            <-sem // zwolnienie zasobu
        }(i)
    }

    wg.Wait()
}

W ten sposób semafor pomaga kontrolować dostęp współbieżny i zapobiega wyścigom i przeciążeniom zasobów.