Sobes.tech
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 горутин.