📌 Deadlock

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

🧠 Как работает

Взаимная блокировка возникает, когда одновременно выполняются следующие условия (по Coffman):

  1. Взаимное исключение — ресурс доступен только одному потоку
  2. Удержание и ожидание — поток удерживает один ресурс и ждёт другой
  3. Отсутствие принудительного освобождения — ресурсы не изымаются
  4. Циклическое ожидание — существует цикл зависимостей между потоками

Пример (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

  • Разрешение: принудительное снятие блокировки, перезапуск потока