Junior
Mis on deadlock?
sobes.tech AI
Vastus AI-lt
Dedlok (Deadlock) — see on olukord, kus kaks või enam voogu või protsessi on lukustatud, oodates üksteist, et jätkata täitmist. See tekib siis, kui iga voog omab ressurssi, mis on vajalik teisele voogule, ning ise ootab selle ressursi vabastamist, mida hoiab teine voog.
Neli tingimust, mis on vajalikud dedloki tekkeks (Koffmani tingimused):
- Üksteise välistus (Mutual Exclusion): Ressurssi ei saa kasutada samaaegselt mitmed protsessid.
- Hoida ja oodata (Hold and Wait): Voog, millel juba on vähemalt üks ressurss, ootab täiendavaid ressursse, mis on hetkel hõivatud teiste voogudega.
- Ilma sundimiseta (No Preemption): Ressursse ei saa sundida voogult ära võtma. Need võivad olla vabastatud ainult vabatahtlikult, selle voogu poolt, kes neid kasutab.
- Ringiline ootus (Circular Wait): On olemas tsükliline ooteahel kahe või enama voogu vahel. Näiteks, Voog A ootab ressurssi, mida hoiab Voog B, mis omakorda ootab ressurssi, mida hoiab Voog C, mis ootab ressurssi, mida hoiab Voog A.
iOS arenduses tekivad dedlokid sageli, kui töötada concurrency (mitmevoogulisuse) funktsionaalsusega, näiteks valesti kasutades GCD-d (Grand Central Dispatch) või Operation Queue-d:
- Püüd sünkroonselt täita koodibloki selles järjekorras, kus juba asub praegune voog (näiteks
syncväljakutsemainjärjekorras peamisest voost). - Kaks voogu püüavad haarata kahte erinevat lukku või semaforit erinevas järjekorras.
Lihtne näide GCD kasutamisega:
func deadlockExample() {
// Peamine järjekord
let mainQueue = DispatchQueue.main
// Sünkroonselt täita blokk peamise järjekorra pealt
// Peamine voog ootab bloki lõpetamist,
// aga blokk ei saa alata, kuna peamine voog on hõivatud ootamisega.
mainQueue.sync {
print("See rida ei jõua kunagi täidetud.")
}
}