Почему случается deadlock

«Почему случается deadlock» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Deadlock возникает, когда два или более потока блокируют друг друга, ожидая ресурсы, занятые другим потоком. Основные условия:

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

Пример:

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

DispatchQueue.global().async {
    lock1.lock()
    sleep(1)
    lock2.lock() // Ждёт lock2, но он занят вторым потоком
    lock2.unlock()
    lock1.unlock()
}

DispatchQueue.global().async {
    lock2.lock()
    sleep(1)
    lock1.lock() // Ждёт lock1, но он занят первым потоком
    lock1.unlock()
    lock2.unlock()
}