Sobes.tech
Junior

Co je to závodní podmínka?

sobes.tech AI

Odpověď od AI

Stav závodu je problém, který se vyskytuje v vícevláknové nebo víceprocesní aplikaci, když závažnost výsledku závisí na pořadí provádění vláken/procesů.

Obvykle k tomu dochází, když několik vláken současně přistupuje ke sdíleným zdrojům (proměnné, soubory, databáze) bez řádné synchronizace.

To vede k nepředvídatelnému chování, chybám a nesprávným datům.

Příklad: Dvě vlákna se pokoušejí současně zvýšit sdílenou proměnnou.

var sharedCounter = 0

func incrementCounter() {
    let currentValue = sharedCounter // Vlákno 1 čte 0
    // Nějaké zpoždění
    let newValue = currentValue + 1 // Vlákno 1 vypočítá 1
    sharedCounter = newValue // Vlákno 1 zapíše 1
}

// Pokud vlákno 2 čte currentValue před tím, než vlákno 1 zapíše newValue:
func anotherIncrementCounter() {
    let currentValue = sharedCounter // Vlákno 2 čte 0
    let newValue = currentValue + 1 // Vlákno 2 vypočítá 1
    sharedCounter = newValue // Vlákno 2 zapíše 1
}

V tomto příkladu, pokud obě vlákna běží současně bez synchronizace, může sharedCounter nakonec být 1 místo očekávaných 2.

Pro zabránění závodním podmínkám se používají mechanismy synchronizace:

  • Mutex (Mutual Exclusion): Zamezí přístupu ke zdroji, povolí pouze jednomu vláknu být v kritické sekci.
  • Semafory: Omezí počet vláken, která mohou současně získat přístup ke zdroji.
  • Dispatch Queue: Úkoly jsou prováděny sekvenčně (pro serial queue) nebo s určitým stupněm paralelismu (pro konkurenční queue) a umožňují synchronizaci přístupu.
  • Zámky (Locks): Různé typy zámků (NSLock, NSRecursiveLock atd.).
  • Atomické operace: Zaručují, že operace (čtení, zápis, inkrementace) jsou prováděny atomicky, tj. nemohou být přerušeny jiným vláknem.

V iOS vývoji se často používá Grand Central Dispatch (GCD) a Operation Queues k řízení vláken a prevenci závodních podmínek. Sériové dispatch queue zajišťují automatickou synchronizaci úkolů prováděných v této frontě.