В каких пределах может быть установлено начальное значение счётчика в семафоре?

«В каких пределах может быть установлено начальное значение счётчика в семафоре?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Начальное значение счётчика в семафоре должно быть неотрицательным целым числом в диапазоне от 0 до Int.max.

Значения и их смысл:

Значение Смысл
0 Все ресурсы заняты, новые потоки будут блокироваться
1 Бинарный семафор (мьютекс)
n > 1 Ограничивает одновременный доступ к n ресурсам
Int.max Теоретический максимум (практически неограниченный доступ)

Примеры на Swift (Grand Central Dispatch):

// Допустимые значения
let binarySemaphore = DispatchSemaphore(value: 1)  // Мьютекс
let poolSemaphore = DispatchSemaphore(value: 5)    // Пул из 5 ресурсов
let unlimitedSemaphore = DispatchSemaphore(value: Int.max)  // Практически без ограничений

// НЕДОПУСТИМО — вызовет краш
let invalidSemaphore = DispatchSemaphore(value: -1)  // EXC_BAD_INSTRUCTION

Поведение семафора:

  • signal(): Увеличивает счётчик на 1, разблокирует ожидающий поток
  • wait(): Уменьшает счётчик на 1, блокирует поток если счётчик < 0

Важно: Счётчик может стать отрицательным, что указывает на количество ожидающих потоков.