Sobes.tech
Middle

Co dělá synchronizace v kontextu vícenásobného zpracování?

sobes.tech AI

Odpověď od AI

Synchronizace v kontextu vícenásobného zpracování zabraňuje závodním podmínkám (race condition) a zajišťuje konzistentní přístup ke sdíleným zdrojům (proměnné, soubory, síťová spojení) z různých vláken.

Hlavní mechanismy synchronizace:

  • Mutex (vzájemné vyloučení): Pouze jedno vlákno může vlastnit mutex a přistupovat k chráněnému zdroji.
  • Semaphore (semafor): Omezuje počet vláken, která mohou současně přistupovat ke zdroji. Funguje s čítačem.
  • Lock (zámek): Obecný pojem, často používaný k označení mutexů nebo jiných mechanismů, které úplně blokují přístup.
  • Dispatch Queue (fronta rozdělení): V Grand Central Dispatch (GCD) mohou být fronty sekvenční (serial) nebo paralelní (concurrent), zajišťující synchronizaci řízením pořadí a počtu současně vykonávaných úloh. Sekvenční fronty garantují vykonání úloh po jednom, což inherentně zajišťuje synchronizaci pro data přistupovaná pouze z úloh této fronty.

Princip fungování: Vlákno, které chce získat přístup ke sdílenému zdroji, nejprve zkusí získat zámek (lock). Pokud je zdroj volný, vlákno získá zámek a pracuje se zdrojem. Po dokončení uvolní zámek (release lock). Pokud je zdroj obsazen, ostatní vlákna jsou blokována (čekají), dokud se zdroj neuvolní.

Příklad použití mutexu k ochraně kritické sekce:

// Příklad v Objective-C s použitím @synchronized
- (void)updateSharedResource {
    @synchronized (self) { // Zámek na objektu self
        // Zde je vykonávána kritická sekce
        // Přístup ke sharedResource je bezpečný
        self.sharedResource++;
    } // Zámek je automaticky uvolněn při opuštění bloku
}
// Příklad v Swift s použitím NSLock
let lock = NSLock()
var sharedCounter = 0

func incrementCounter() {
    lock.lock() // Pokus o získání zámku
    // Kritická sekce
    sharedCounter += 1
    lock.unlock() // Uvolnění zámku
}

Synchronizace pomáhá zabránit problémům, jako jsou:

  • Poškození dat.
  • Deadlock (zablokování vzájemného zámku) vláken.
  • Livelock (aktivní zablokování) vláken.

Volba vhodného mechanismu synchronizace závisí na povaze úkolu a typu zdroje.