Sobes.tech
Junior — Middle

Какво е предназначението на механизма на семафора в многопоточната програмиране?

sobes.tech AI

Отговор от AI

Семафорът в многопоточната програмиране се използва за управление на достъпа до споделени ресурси, като ограничава броя на нишките, които могат да използват този ресурс едновременно. Той съхранява брояч, който намалява при вземане на ресурса и увеличава при освобождаване. Ако броячът е нула, новите нишки се блокират, докато ресурсът не бъде освободен.

Пример в Go с използване на канал като семафор:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    sem := make(chan struct{}, 3) // семафор с максимален брояч 3

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            sem <- struct{}{} // вземане на ресурс
            fmt.Printf("Горутина %d започна работа\n", id)
            // симулация на работа
            // time.Sleep(time.Second)
            fmt.Printf("Горутина %d приключи работа\n", id)
            <-sem // освобождаване на ресурса
        }(i)
    }

    wg.Wait()
}

По този начин семафорът помага да се контролира конкурентният достъп и да се предотвратят състезателни условия и претоварване на ресурсите.