← Назад к вопросам

Что такое DeadLock?

1.0 Junior🔥 151 комментариев
#Многопоточность и асинхронность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

DeadLock — тупиковая ситуация в многопоточности

Deadlock (взаимная блокировка) — это ситуация, когда два или более потока бесконечно ждут друг друга, и ни один из них не может продолжить работу. Это критическая проблема, которая может заморозить приложение.

Классический пример DeadLock

let lock1 = NSLock()
let lock2 = NSLock()

// Поток 1
lock1.lock()
usleep(100)
lock2.lock()

// Поток 2
lock2.lock()
usleep(100)
lock1.lock()

Что происходит:

  1. Поток 1 захватывает lock1
  2. Поток 2 захватывает lock2
  3. Поток 1 пытается захватить lock2 (занят)
  4. Поток 2 пытается захватить lock1 (занят)
  5. Оба потока зависают

Четыре условия для DeadLock

1. Mutual Exclusion — ресурс может использоваться одним потоком 2. Hold and Wait — поток удерживает ресурс и ждёт другого 3. No Preemption — нельзя отобрать ресурс 4. Circular Wait — циклическое ожидание ресурсов

Пример DeadLock с главным потоком

DispatchQueue.main.sync {
    // DEADLOCK!
}

Как избежать

✅ Используй async вместо sync ✅ Захватывай locks в одном порядке ✅ Избегай вложенных блокировок ✅ Используй DispatchSemaphore с таймаутом ✅ Предпочитай Serial Queue ✅ Используй Swift Actor

Deadlock — коварная проблема, которая проявляется редко, но очень сложно дебагируется. Профилактика важнее лечения.

Что такое DeadLock? | PrepBro