Sobes.tech
Middle

Ի՞նչ կլինի, եթե գլխավոր հոսքում կատարեք ինքնին սինխրոնային կանչ, և ինչու դա կհանգեցնի փոխադարձ բլոկավորման։

sobes.tech AI

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

Եթե iOS հավելվածի հիմնական հոսքում (main thread) ինքն իրեն սինխրոնային կանչ կատարեք, օրինակ՝ DispatchQueue.main.sync-ով, դա կհանգեցնի փոխադարձ բլոկավորման (deadlock)-ի:

Ինչու է դա տեղի ունենում՝

  • Հիմնական հոսքը արդեն զբաղված է ընթացիկ կոդի կատարմամբ:
  • Սինխրոնային կանչի ժամանակ, նա փորձում է կատարել կոդի բլոկ, որը պետք է տեղադրվի հիմնական հոսքի հերթում:
  • Բայց հիմնական հոսքը չի կարող մշակել այդ բլոկը, մինչև որ ավարտի ընթացիկը, իսկ ընթացիկը սպասում է սինխրոնային կանչի ավարտին:

Արդյունքում, ստեղծվում է իրավիճակ, երբ հոսքը սպասում է ինքն իրեն, և կատարմամբը կանգ է առնում հավերժ:

Swift-ում օրինակ՝

DispatchQueue.main.sync {
    // Այս կոդը փորձում է սինխրոն կերպով կատարել հիմնական հոսքում,
    // բայց եթե կանչը գալիս է հիմնական հոսքից, տեղի կունենա deadlock
}