Sobes.tech
Junior

Čo je to závodná podmienka?

sobes.tech AI

Odpoveď od AI

Stav závodu je problém, ktorý sa vyskytuje v viacvláknovej alebo viacprocesnej aplikácii, keď správnosť výsledku závisí od poradia vykonávania vlákien/procesov.

Zvyčajne k tomu dochádza, keď niekoľko vlákien súčasne pristupuje ku zdieľaným zdrojom (premenné, súbory, databázy) bez správnej synchronizácie.

To vedie k nepredvídateľnému správaniu, chybám a nesprávnym údajom.

Príklad: Dve vlákna sa pokúšajú súčasne zvýšiť zdieľanú premennú.

var sharedCounter = 0

func incrementCounter() {
    let currentValue = sharedCounter // Vlákno 1 číta 0
    // Nejaké oneskorenie
    let newValue = currentValue + 1 // Vlákno 1 vypočíta 1
    sharedCounter = newValue // Vlákno 1 zapíše 1
}

// Ak vlákno 2 číta currentValue predtým, než vlákno 1 zapíše newValue:
func anotherIncrementCounter() {
    let currentValue = sharedCounter // Vlákno 2 číta 0
    let newValue = currentValue + 1 // Vlákno 2 vypočíta 1
    sharedCounter = newValue // Vlákno 2 zapíše 1
}

V tomto príklade, ak obe vlákna bežia súčasne bez synchronizácie, nakoniec sharedCounter môže byť 1 namiesto očakávaných 2.

Na prevenciu závodných podmienok sa používajú mechanizmy synchronizácie:

  • Mutex (Mutual Exclusion): Zablokuje prístup ku zdroju, umožňujúc len jednému vláknu byť v kritickej sekcii.
  • Semafory: Obmedzujú počet vlákien, ktoré môžu súčasne pristupovať ku zdroju.
  • Dispatch Queues: Úlohy sa vykonávajú sekvenčne (pre sériové fronty) alebo s určitým stupňom paralelizmu (pre konkurenčné fronty), s možnosťou synchronizácie prístupu.
  • Zámky (Locks): Rôzne typy zámkov (NSLock, NSRecursiveLock a pod.).
  • Atómové operácie: Zaručujú, že operácia (čítanie, zápis, inkrement) sa vykonáva atomicky, t.j. nemôže byť prerušená iným vláknom.

V iOS vývoji sa často používajú Grand Central Dispatch (GCD) a Operation Queues na správu vlákien a prevenciu závodných podmienok. Sériové dispatch queues zabezpečujú automatickú synchronizáciu úloh vykonávaných v tejto fronte.