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()
}
По този начин семафорът помага да се контролира конкурентният достъп и да се предотвратят състезателни условия и претоварване на ресурсите.