Sobes.tech
Middle

Vysvetlite, čo je data race v kontexte viacvláknového vývoja.

sobes.tech AI

Odpoveď od AI

Race condition je stav, keď viacero vlákien alebo procesov súčasne pristupuje k rovnakej oblasti pamäte (premenná, objekt) a aspoň jedno z nich vykonáva zápis, bez akejkoľvek synchronizácie prístupu.

Dôsledky race condition sú nepredvídateľné a môžu zahŕňať:

  • Nesprávne hodnoty premenných.
  • Pád aplikácie.
  • Iné ťažko odhaliteľné chyby.

Príklad race condition v Swift:

// Nechránený čítač
var counter = 0

// Funkcia, ktorá zvyšuje čítač v vlákne
func incrementCounter() {
    for _ in 0..<1000 {
        counter += 1 // Tu dochádza k race condition
    }
}

// Vytvorenie a spustenie viacerých vlákien
let queue = DispatchQueue.global()
queue.async {
    incrementCounter()
}

queue.async {
    incrementCounter()
}

// Výsledkom môže byť, že counter nebude rovný 2000

Spôsoby, ako zabrániť race condition:

  • Zámky (Locks): NSLock, os_unfair_lock.
  • Mutexy: Používajú sa s pthread_mutex.
  • Semafory: DispatchSemaphore.
  • Konkurenčné fronty s bariérami: DispatchQueue(label: "myQueue", attributes: .concurrent) s príznakom .barrier pri zápise.
  • Synchronized (Objective-C): @synchronized.
  • Atomické operácie: Použitie atomických typov ako AtomicBool.
  • Štruktúry dát bezpečné pre konkurenčný prístup: Napríklad NSCache alebo špecializované knižnice.