Junior — Middle
Mi különbözteti meg az NSRecursiveLock-ot a standard NSLock-tól a több szálas környezetben?
sobes.tech MI
Válasz az MI-től
Az NSLock egy egyszerű kölcsönös kizáró zárolás, amely megakadályozza, hogy egy szál belépjen a kritikus szakaszba, ha egy másik szál már tartja a zárolást. Ha egy szál, amely már tartja az NSLock-ot, megpróbálja újra megszerezni, akkor blokkolódik, ami deadlock-hoz vezet.
Az NSRecursiveLock abban különbözik, hogy lehetővé teszi ugyanazon szálnak, hogy többször is megszerezze a zárolást anélkül, hogy blokkolódna. Ez akkor hasznos, amikor rekurzív módon hívott metódusok ugyanazt a zárolást használják. Az NSRecursiveLock számlálót tart a megszerzések számára, és a zárolás csak a megfelelő számú unlock hívás után szabadul fel.
Példa:
let lock = NSRecursiveLock()
func recursiveFunction(_ count: Int) {
lock.lock()
defer { lock.unlock() }
if count > 0 {
recursiveFunction(count - 1) // rekurzív zárolás megszerzése ugyanabban a szálban
}
}
recursiveFunction(3)
Ha az NSLock-ot használnánk, akkor rekurzív hívásnál deadlock fordulna elő.