Sobes.tech
Junior

Kas yra lenktynių sąlyga?

sobes.tech AI

Atsakymas iš AI

Greičio būklė — tai problema, kuri kyla daugiasluoksnėse arba daugiaprocesinėse programose, kai rezultato tikslumas priklauso nuo srautų/procesų vykdymo tvarkos.

Dažniausiai tai įvyksta, kai keli srautai vienu metu prieina prie bendrų išteklių (kintamųjų, failų, duomenų bazių) be tinkamos sinchronizacijos.

Tai sukelia nenuspėjamą elgesį, klaidas ir netikslius duomenis.

Pavyzdys: du srautai vienu metu bando padidinti bendrą kintamąjį:

var sharedCounter = 0

func incrementCounter() {
    let currentValue = sharedCounter // Srautas 1 skaito 0
    // Tam tikras delsimas
    let newValue = currentValue + 1 // Srautas 1 skaičiuoja 1
    sharedCounter = newValue // Srautas 1 įrašo 1
}

// Jei Srautas 2 skaito currentValue iki to, kai Srautas 1 įrašo newValue:
func anotherIncrementCounter() {
    let currentValue = sharedCounter // Srautas 2 skaito 0
    let newValue = currentValue + 1 // Srautas 2 skaičiuoja 1
    sharedCounter = newValue // Srautas 2 įrašo 1
}

Šiame pavyzdyje, jei abu srautai vykdomi vienu metu be sinchronizacijos, galutinis sharedCounter gali būti 1 vietoj tikėtino 2.

Siekiant išvengti lenktynių būsenos, naudojami sinchronizacijos mechanizmai:

  • MUTEX (Muteksas): Blokuoja prieigą prie ištekliaus, leidžiant tik vienam srautui būti kritinėje sekcijoje.
  • Semaforas: Ribojama srautų, kurie gali vienu metu pasiekti išteklių, skaičius.
  • Užklausos eilės (Dispatch Queues GCD): Darbų vykdymas vyksta nuosekliai (Serial Queue) arba su tam tikru paralelizmo lygiu (Concurrent Queue), su galimybe sinchronizuoti prieigą.
  • Užraktai (Locks): Skirtingų tipų užraktai (pvz., NSLock, NSRecursiveLock).
  • Atomarinės operacijos: Garantuoja, kad operacija (skaitymas, rašymas, didinimas) vykdoma atomariai, t.y., be kito srauto įsikišimo.

iOS kūrime dažnai naudojami Grand Central Dispatch (GCD) ir Operation Queues valdyti srautus ir išvengti lenktynių būsenų. Serial Dispatch Queues užtikrina automatinę užduočių sinchronizaciją, vykdomą šioje eilėje.