Sobes.tech
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ő.