Ответ
Начальное значение счётчика в семафоре должно быть неотрицательным целым числом в диапазоне от 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
Важно: Счётчик может стать отрицательным, что указывает на количество ожидающих потоков.