📌 Deadlock
Deadlock — ситуация, при которой два или более потоков или процессов навсегда ждут ресурсов, захваченных друг другом. Ни один из участников не может продолжить выполнение.
🧠 Как работает
Взаимная блокировка возникает, когда одновременно выполняются следующие условия (по Coffman):
- Взаимное исключение — ресурс доступен только одному потоку
- Удержание и ожидание — поток удерживает один ресурс и ждёт другой
- Отсутствие принудительного освобождения — ресурсы не изымаются
- Циклическое ожидание — существует цикл зависимостей между потоками
Пример (C-like):
// Thread A
lock(mutex1);
lock(mutex2); // блокируется, если mutex2 занят Thread B
// Thread B
lock(mutex2);
lock(mutex1); // блокируется, если mutex1 занят Thread A
⚙️ Где возникает
Область | Примеры |
---|---|
Multithreading | Неправильный порядок захвата Mutex |
Database | Взаимные блокировки транзакций |
Kernel | Некорректное использование Semaphore/Spinlock |
Filesystem | Зависания при монтировании/снятии |
Distributed System | Взаимные RPC-зависимости |
✅ Преимущества (отсутствуют)
Deadlock — ошибка проектирования. Единственный плюс — позволяет обнаружить узкие места в логике параллельности.
❌ Недостатки
-
Полная остановка исполнения
-
Трудность обнаружения и диагностики
-
Неочевидные условия в многопоточной среде
-
Может проявляться только при определённой нагрузке (heisenbug)
🛡 Методы предотвращения/обхода
-
Избежание: Lock ordering, таймауты, try-lock
-
Обнаружение: мониторинг графа зависимостей
-
Предотвращение: использование одного глобального Mutex
-
Разрешение: принудительное снятие блокировки, перезапуск потока