> Может ли дедлок возникать между задачами на разных очередях (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Bip.ru

Стек: iOS, Swift

> Пример ответа

Да, дедлок может возникать между задачами на разных очередях в iOS. Это происходит, когда две или более задач блокируют друг друга, ожидая ресурсов, которые удерживаются другими задачами на разных очередях.

Например, в Swift с использованием Grand Central Dispatch (GCD) и семафоров:

SWIFT
let queue1 = DispatchQueue(label: "queue1")
let queue2 = DispatchQueue(label: "queue2")
let semaphore1 = DispatchSemaphore(value: 0)
let semaphore2 = DispatchSemaphore(value: 0)
queue1.async {
semaphore1.wait() // ожидает сигнал от queue2
// критическая секция
semaphore2.signal()
}
queue2.async {
semaphore2.wait() // ожидает сигнал от queue1
// критическая секция
semaphore1.signal()
}

Здесь queue1 ждет semaphore1, который будет освобожден только после выполнения queue2, а queue2 ждет semaphore2, который освободится после queue1. В результате обе задачи зависают - классический дедлок.

Также дедлок возможен при использовании sync на одной очереди (например, рекурсивный вызов), но между разными очередями он возникает при неправильной синхронизации общих ресурсов. Чтобы избежать этого, следует использовать упорядоченное захватывание ресурсов или избегать блокировок в асинхронных задачах.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью