Sobes.tech
Middle+

Ի՞նչ կլինի, եթե AppDelegate-ում գլխավոր հոսքում կանչեք 'dispatchQueue.main.sync'-ը։

sobes.tech AI

Պատասխան AI-ից

Կատարվում է փոխադարձ փակման (Deadlock)։

Ներկայացում:

  1. AppDelegate աշխատում է գլխավոր հոսքում:
  2. dispatchQueue.main.sync փորձում է կատարել կոդը գլխավոր հոսքում սինխրոն՝ սպասելով կոդի բլոկի ավարտին:
  3. Բայց գլխավոր հոսքը արդեն զբաղված է AppDelegate-ի կատարումով և սպասում է sync-ի բլոկի ավարտին:
  4. sync-ի բլոկը չի կարող սկսել, քանի որ գլխավոր հոսքը զբաղված է սպասելով:

Ամփոփելով՝ գլխավոր հոսքը սպասում է բլոկի ավարտին, իսկ բլոկը սպասում է գլխավոր հոսքի ազատմանը — առաջանում է Deadlock։ Ծրագիրը կկանգնի:

Օրինակ կոդ, որը կհանգեցնի Deadlock-ի:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    print("Դիմումը սկսվեց")

    // Այս կանչը կհանգեցնի Deadlock-ի
    DispatchQueue.main.sync {
        print("Այս կոդը երբեք չի կատարվի")
    }

    print("Այս կոդը նույնպես չի հասնի")

    return true
}