Комментарии (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 захватывает lock1
- Поток 2 захватывает lock2
- Поток 1 пытается захватить lock2 (занят)
- Поток 2 пытается захватить lock1 (занят)
- Оба потока зависают
Четыре условия для 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 — коварная проблема, которая проявляется редко, но очень сложно дебагируется. Профилактика важнее лечения.