Middle
Ի՞նչ կլինի, եթե գլխավոր հոսքում կատարեք ինքնին սինխրոնային կանչ, և ինչու դա կհանգեցնի փոխադարձ բլոկավորման։
sobes.tech AI
Պատասխան AI-ից
Եթե iOS հավելվածի հիմնական հոսքում (main thread) ինքն իրեն սինխրոնային կանչ կատարեք, օրինակ՝ DispatchQueue.main.sync-ով, դա կհանգեցնի փոխադարձ բլոկավորման (deadlock)-ի:
Ինչու է դա տեղի ունենում՝
- Հիմնական հոսքը արդեն զբաղված է ընթացիկ կոդի կատարմամբ:
- Սինխրոնային կանչի ժամանակ, նա փորձում է կատարել կոդի բլոկ, որը պետք է տեղադրվի հիմնական հոսքի հերթում:
- Բայց հիմնական հոսքը չի կարող մշակել այդ բլոկը, մինչև որ ավարտի ընթացիկը, իսկ ընթացիկը սպասում է սինխրոնային կանչի ավարտին:
Արդյունքում, ստեղծվում է իրավիճակ, երբ հոսքը սպասում է ինքն իրեն, և կատարմամբը կանգ է առնում հավերժ:
Swift-ում օրինակ՝
DispatchQueue.main.sync {
// Այս կոդը փորձում է սինխրոն կերպով կատարել հիմնական հոսքում,
// բայց եթե կանչը գալիս է հիմնական հոսքից, տեղի կունենա deadlock
}