Middle
Čo robí synchronizácia v kontexte viacvláknového spracovania?
sobes.tech AI
Odpoveď od AI
Synchronizácia v kontexte viacvláknového programovania zabraňuje podmienke súťaže (race condition) a zabezpečuje konzistentný prístup k spoločným zdrojom (premenné, súbory, sieťové spojenia) z rôznych vlákien.
Hlavné mechanizmy synchronizácie:
- Mutex (mutex): Vzájomné vylúčenie. Len jedno vlákno môže vlastniť mutex a pristupovať k chránenému zdroju.
- Semaphore (semafor): Obmedzuje počet vlákien, ktoré môžu súčasne pristupovať ku zdroju. Funguje so číslom.
- Lock (zámok): Všeobecný pojem, často používaný na označenie mutexov alebo iných mechanizmov, ktoré úplne blokujú prístup.
- Dispatch Queue (fronta vykonávania): V Grand Central Dispatch (GCD) môžu byť fronty sekvenčné (serial) alebo paralelné (concurrent), zabezpečujúc synchronizáciu riadením poradia a počtu súčasne vykonávaných úloh. Sekvenčné fronty garantujú vykonanie úloh po jednom, čo inherentne zabezpečuje synchronizáciu pre dáta, ku ktorým sa pristupuje iba z úloh tejto fronty.
Princíp práce: Vlákno, ktoré chce získať prístup k spoločnému zdroju, najskôr sa pokúsi získať zámok (acquire lock). Ak je zdroj voľný, vlákno získa zámok a pracuje so zdrojom. Po dokončení práce uvoľní zámok (release lock). Ak je zdroj obsadený, ostatné vlákna sa blokujú (čakajú), kým sa zdroj neuvoľní.
Príklad použitia mutexu na ochranu kritickej sekcie:
// Príklad v Objective-C s použitím @synchronized
- (void)updateSharedResource {
@synchronized (self) { // Zámok na objekte self
// Tu sa vykonáva kritická sekcia
// Prístup k sharedResource je bezpečný
self.sharedResource++;
} // Zámok sa automaticky uvoľní pri ukončení bloku
}
// Príklad v Swift s použitím NSLock
let lock = NSLock()
var sharedCounter = 0
func incrementCounter() {
lock.lock() // Pokus o získanie zámku
// Kritická sekcia
sharedCounter += 1
lock.unlock() // Uvoľnenie zámku
}
Synchronizácia zabraňuje problémom ako:
- Poškodenie (korupcia) dát.
- Deadlock (vzájomné blokovanie) vlákien.
- Livelock (aktívne blokovanie) vlákien.
Výber vhodného mechanizmu synchronizácie závisí od povahy úlohy a typu zdroja.