Sobes.tech
Junior

Какво е deadlock?

sobes.tech AI

Отговор от AI

Deadlock (Deadlock) е състояние, при което два или повече нишки или процеси се блокират взаимно, очаквайки освобождаването на ресурса от другия, за да продължат изпълнението си. Това се случва, когато всяка нишка притежава ресурс, който е необходим на друга нишка, и чака той да бъде освободен.

Четири условия, необходими за възникване на deadlock (условия на Coffman):

  1. Взаимно изключване (Mutual Exclusion): Ресурсът не може да бъде използван едновременно от няколко процеса.
  2. Задържане и чакане (Hold and Wait): Нишка, която вече притежава поне един ресурс, чака да получи допълнителни ресурси, които се държат от други нишки.
  3. Без принудително отнемане (No Preemption): Ресурсите не могат да бъдат принудително отнети от нишка. Те могат да бъдат освободени само доброволно от нишката, която ги притежава.
  4. Циклично чакане (Circular Wait): Съществува цикъл на чакане между две или повече нишки. Например, нишка A чака ресурс, който държи нишка B, която от своя страна чака ресурс, който държи нишка C, която чака ресурс, който държи нишка A.

В разработката за iOS, deadlock-ите често възникват при работа с конкуренция, например при неправилна употреба на GCD (Grand Central Dispatch) или Operation Queues:

  • Опит за синхронно изпълнение на блок код в опашка, в която вече се намира текущата нишка (например, извикване на sync на main опашката от главната нишка).
  • Две нишки се опитват да вземат два различни заключвания или семафора в различен ред.

Пример за прост deadlock с използване на GCD:

func deadlockExample() {
    // Главна опашка
    let mainQueue = DispatchQueue.main

    // Изпълнение синхрон на блок в главната опашка от главната нишка
    // Главната нишка чака завършването на блока,
    // а блокът не може да се изпълни, защото главната нишка е заета с очакване.
    mainQueue.sync {
        print("Тази линия никога няма да бъде достигната.")
    }
}