Sobes.tech
Назад к вопросам
Junior — Middle
75

Можете объяснить принцип функционирования семафора в многопоточном программировании?

Компании, где спрашивали
AstonAston
VKVK

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

sobes.tech AI

Семафор — это механизм синхронизации в многопоточном программировании, который контролирует доступ к общему ресурсу. Он содержит счетчик, который показывает, сколько потоков могут одновременно получить доступ к ресурсу.

Принцип работы:

  • Изначально счетчик семафора устанавливается в число, равное количеству доступных ресурсов.
  • Когда поток хочет получить доступ, он вызывает операцию "wait" (или "acquire"), которая уменьшает счетчик на 1.
  • Если счетчик становится меньше нуля, поток блокируется и ждет, пока другой поток не освободит ресурс.
  • Когда поток освобождает ресурс, он вызывает операцию "signal" (или "release"), увеличивая счетчик на 1 и разблокируя ожидающие потоки.

Пример на Swift с использованием DispatchSemaphore:

let semaphore = DispatchSemaphore(value: 2) // разрешаем одновременно 2 потока

DispatchQueue.global().async {
    semaphore.wait() // пытаемся получить доступ
    print("Поток начал работу")
    sleep(2) // имитация работы
    print("Поток закончил работу")
    semaphore.signal() // освобождаем ресурс
}

Таким образом, семафор помогает ограничить количество потоков, одновременно работающих с общим ресурсом, предотвращая гонки и обеспечивая корректность данных.