Sobes.tech
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.