Ответ
Deadlock возникает, когда два или более потока блокируют друг друга, ожидая ресурсы, занятые другим потоком. Основные условия:
- Взаимное исключение - ресурс занят одним потоком
- Удержание и ожидание - поток держит ресурс и ждёт другой
- Нет вытеснения - ресурсы нельзя отнять
- Циклическое ожидание - потоки ждут друг друга по кругу
Пример:
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()
}