Sobes.tech
Middle

Vysvětlete, co je to data race v kontextu vícenásobného vývoje.

sobes.tech AI

Odpověď od AI

Race condition je stav, kdy několik vláken nebo procesů současně přistupuje ke stejné oblasti paměti (proměnné, objektu) a alespoň jedno z nich provádí zápis, bez jakékoli synchronizace přístupu.

Důsledky race condition jsou nepředvídatelné a mohou zahrnovat:

  • Nesprávné hodnoty proměnných.
  • Pád aplikace.
  • Jiné těžko odhalitelné chyby.

Příklad race condition v Swift:

// Nechráněný čítač
var counter = 0

// Funkce, která zvyšuje čítač v vlákně
func incrementCounter() {
    for _ in 0..<1000 {
        counter += 1 // Zde dochází k race condition
    }
}

// Vytvoření a spuštění více vláken
let queue = DispatchQueue.global()
queue.async {
    incrementCounter()
}

queue.async {
    incrementCounter()
}

// Výsledkem může být, že counter nebude rovno 2000

Způsoby, jak zabránit race condition:

  • Zámky (Locks): NSLock, os_unfair_lock.
  • Mutexy: Používají se s pthread_mutex.
  • Semafory: DispatchSemaphore.
  • Konkurenční fronty s bariérami: DispatchQueue(label: "myQueue", attributes: .concurrent) s příznakem .barrier při zápisu.
  • Synchronized (Objective-C): @synchronized.
  • Atomické operace: Použití atomických typů, například AtomicBool.
  • Struktury dat bezpečné pro konkurenční přístup: Například NSCache nebo specializované knihovny.