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)