Sobes.tech
Back to questions
Middle
105
questionbank

Что такое семафор в контексте программирования?

Sobes Copilot

Get answers in real time

Answer from AI

sobes.tech AI

Семафор — это примитив синхронизации потоков, который управляет доступом к ограниченному ресурсу. Он поддерживает целочисленный счётчик.

Основные операции:

  • wait() (или P / acquire): Уменьшает счётчик на 1. Если счётчик становится отрицательным, поток блокируется до тех пор, пока другой поток не выполнит signal().
  • signal() (или V / release): Увеличивает счётчик на 1. Если есть заблокированные потоки, один из них разблокируется.

Типы семафоров:

  • Бинарный семафор (мьютекс): Счётчик принимает значения 0 или 1. Используется для обеспечения взаимного исключения – только один поток может получить доступ к ресурсу одновременно.
  • Счетный семафор: Счётчик может принимать значения от 0 до N. Используется для управления доступом к пулу ресурсов с ограниченным количеством доступных элементов.

Пример использования на Swift для ограничения количества одновременно работающих задач:

// Создание семафора, разрешающего до 3 одновременных доступа
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Задача 1
    semaphore.wait() // Уменьшаем счетчик, блокируем если > 3 задач работают
    print("Задача 1 стартовала")
    Thread.sleep(forTimeInterval: 2) // Эмуляция работы
    print("Задача 1 завершена")
    semaphore.signal() // Увеличиваем счетчик, разблокируем ожидающие задачи
}

DispatchQueue.global().async {
    // Задача 2
    semaphore.wait()
    print("Задача 2 стартовала")
    Thread.sleep(forTimeInterval: 3)
    print("Задача 2 завершена")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Задача 3
    semaphore.wait()
    print("Задача 3 стартовала")
    Thread.sleep(forTimeInterval: 1)
    print("Задача 3 завершена")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Задача 4 (будет ждать, пока не освободится слот)
    semaphore.wait()
    print("Задача 4 стартовала")
    Thread.sleep(forTimeInterval: 2)
    print("Задача 4 завершена")
    semaphore.signal()
}

// Ждем завершения всех задач для демонстрации
// Используйте в реальном коде более надежные механизмы ожидания
Thread.sleep(forTimeInterval: 5)