Back to questions
Senior
5
Что такое семафор?
Companies where asked
техвил
Answer from AI
sobes.tech AI
Семафор — это примитив синхронизации, используемый для управления доступом к общему ресурсу в многопоточных или конкурентных системах. Он содержит счетчик, который показывает, сколько потоков могут одновременно получить доступ к ресурсу.
Принцип работы:
- Когда поток хочет получить доступ, он пытается "захватить" семафор. Если счетчик больше нуля, он уменьшается на 1, и поток продолжает работу.
- Если счетчик равен нулю, поток блокируется и ждет, пока другой поток не освободит семафор.
- Когда поток заканчивает работу с ресурсом, он "освобождает" семафор, увеличивая счетчик на 1.
В Go семафоры можно реализовать с помощью каналов или использовать сторонние библиотеки.
Пример простого семафора на Go с использованием канала:
package main
import (
"fmt"
"time"
)
func worker(id int, sem chan struct{}) {
sem <- struct{}{} // захват семафора
fmt.Printf("Worker %d started\n", id)
time.Sleep(time.Second) // работа
fmt.Printf("Worker %d finished\n", id)
<-sem // освобождение семафора
}
func main() {
sem := make(chan struct{}, 3) // семафор с максимальной пропускной способностью 3
for i := 1; i <= 5; i++ {
go worker(i, sem)
}
time.Sleep(5 * time.Second)
}
В этом примере одновременно могут работать не более 3 горутин.