Назад к вопросам
Middle
81
questionbank

Что такое семафор?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

Семафор - это низкоуровневый примитив синхронизации, который контролирует доступ к ресурсам. Он поддерживает счетчик (счетчик доступных ресурсов) и две основные операции: ожидание (wait) и сигнал (signal).

  • Ожидание (Wait / wait()): Уменьшает счетчик. Если счетчик становится отрицательным (что указывает на отсутствие доступных ресурсов), текущий поток блокируется до тех пор, пока другой поток не вызовет сигнал.
  • Сигнал (Signal / signal()): Увеличивает счетчик. Если после увеличения счетчик становится неотрицательным и есть заблокированные потоки, один из них разблокируется.

Семафоры могут использоваться для:

  • Ограничения доступа к разделяемому ресурсу: Инициализируется с максимальным количеством потоков, которые могут одновременно получить доступ.
  • Синхронизации задач: Один поток может ждать, пока другой поток завершит определенное действие.

В Darwin (основа iOS):

import Dispatch

// Создание семафора со счетчиком 1 (аналогично мьютексу)
let semaphore = DispatchSemaphore(value: 1)

func accessResource() {
    // Ожидание доступа (блокируется, если счетчик 0)
    semaphore.wait()

    // Доступ к разделяемому ресурсу
    print("Доступ к ресурсу получен")

    // Завершение доступа (увеличивает счетчик)
    semaphore.signal()
    print("Доступ к ресурсу завершен")
}

// Пример использования в многопоточной среде
DispatchQueue.global().async {
    accessResource()
}

DispatchQueue.global().async {
    accessResource()
}

Основные типы семафоров:

  • Бинарный семафор: Значение счетчика может быть только 0 или 1. Действует аналогично мьютексу.
  • Счетный семафор: Значение счетчика может быть больше 1, что позволяет ограничить доступ к ресурсу определенному количеству потоков одновременно.