Назад к вопросам
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, что позволяет ограничить доступ к ресурсу определенному количеству потоков одновременно.