Что такое deadlock

Deadlock - это тупик. Один поток ждет освобождения второго, а второй ждет освобождения первого. Таким образом происходит зависание приложения. Пример: в качестве делегата передаем себя как сильную ссылку. А в контроллере-делегате пытаемся удалить делегат. В случае с потоками происходит зависание.

Обратная ситуация - livelock

Хороший пример deadlock привели на хабре

Допустим в системе существуют две задачи с низким (А) и высоким (Б) приоритетом, которые используют два ресурса — X и Y:

В момент времени T1 задача (А) блокирует ресурс X. Затем в момент времени T2 задачу (А) вытесняет более приоритетная задача (Б), которая в момент времени T3 блокирует ресурс Y. Если задача (Б) попытается заблокировать ресурс X (T4) не освободив ресурс Y, то она будет переведена в состояние ожидания, а выполнение задачи (А) будет продолжено. Если в момент времени T5 задача (А) попытается заблокировать ресурс Y, не освободив X, возникнет состояние взаимной блокировки — ни одна из задач (А) и (Б) не сможет получить управление.

Как избежать?
Взаимная блокировка возможна только тогда, когда в системе используется зависимый (вложенный) многопоточный доступ к ресурсам. Взаимной блокировки можно избежать, если не использовать вложенность, или если ресурс использует протокол увеличения приоритета. Если после получения данных из сети в фоновой очереди попытаемся использовать для возвращения на main queue метод sync, то мы мы получим взаимную блокировку (deadock).

НИКОГДА НЕ вызывайте метод sync на main queue, потому что это приведет к взаимной блокировке (deadlock) вашего приложения!

Oct. 15, 2023, Источник

"deadlock" описывает ситуацию, при которой два или более процессов (или потоков) останавливаются, ожидая друг друга, чтобы освободить ресурсы или завершить выполнение. Каждый процесс занимает ресурс, который требуется другому процессу для продолжения работы, и ни один из них не может продолжить выполнение, так как ожидает освобождения ресурса другим процессом. Это приводит к заморозке всех участвующих процессов и, возможно, всей системы или приложения.

Как он возникает

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

Пример, который может привести к deadlock в многопоточном приложении:

```swift
var lockA = NSLock()
var lockB = NSLock()

func thread1() {
    lockA.lock()
    print("Thread 1 locked A")
    sleep(1) // Даем время другому потоку захватить lockB
    lockB.lock()
    print("Thread 1 locked B")
    lockB.unlock()
    lockA.unlock()
}

func thread2() {
    lockB.lock()
    print("Thread 2 locked B")
    sleep(1) // Даем время первому потоку захватить lockA
    lockA.lock()
    print("Thread 2 locked A")
    lockA.unlock()
    lockB.unlock()
}

DispatchQueue.global().async(execute: thread1)
DispatchQueue.global().async(execute: thread2)
```

В этом примере `thread1` и `thread2` запускаются параллельно и пытаются получить два замка (`lockA` и `lockB`). Однако из-за временной задержки (`sleep`) каждый поток успевает захватить один замок и ожидает освобождения второго, который держит другой поток. Это ведет к взаимной блокировке.

Чтобы избежать deadlock, можно:

  • Использовать тайм-ауты при попытках захвата замков.
  • Убедиться, что все потоки захватывают замки в одном и том же порядке.
  • Использовать алгоритмы обнаружения deadlock и соответствующие стратегии восстановления.

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

April 23, 2024, easyoffer