Č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,NSRecursiveLocka 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.