Sobes.tech
Назад к вопросам
Junior — Middle
79

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

Компании, где спрашивали
Астрал-Софт

Ответ от нейросети

sobes.tech 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()
}

Таким образом, семафор помогает контролировать конкурентный доступ и предотвращать гонки и переполнение ресурсов.