Sobes.tech
Junior

Шта је услов трке?

sobes.tech АИ

Одговор од АИ

Stanje trke je problem koji se javlja u višestrukom niti ili višestrukom procesu aplikacije, kada tačnost rezultata zavisi od reda izvršavanja niti/procesa.

Obično se javlja kada više niti istovremeno pristupa zajedničkim resursima (promenljivima, fajlovima, bazama podataka) bez odgovarajuće sinhronizacije.

To dovodi do nepredvidivog ponašanja, grešaka i netačnih podataka.

Primer: Dve niti pokušavaju istovremeno da poveća zajedničku promenljivu.

var sharedCounter = 0

func incrementCounter() {
    let currentValue = sharedCounter // Nit 1 čita 0
    // Neko kašnjenje
    let newValue = currentValue + 1 // Nit 1 računa 1
    sharedCounter = newValue // Nit 1 zapisuje 1
}

// Ako nit 2 pročita currentValue pre nego što nit 1 upiše newValue:
func anotherIncrementCounter() {
    let currentValue = sharedCounter // Nit 2 čita 0
    let newValue = currentValue + 1 // Nit 2 računa 1
    sharedCounter = newValue // Nit 2 zapisuje 1
}

U ovom primeru, ako se obe niti izvršavaju istovremeno bez sinhronizacije, na kraju sharedCounter može postati 1 umesto očekivanih 2.

Da bi se sprečili uslovi trke, koriste se mehanizmi za sinhronizaciju:

  • Mutex (Međusobno isključivanje): Blokira pristup resursu, dozvoljavajući samo jednoj niti da bude u kritičnom odeljku.
  • Semafori: Ograničavaju broj niti koje mogu istovremeno pristupiti resursu.
  • Dispatch Queue: Izvršavanje zadataka se obavlja redom (za serijske redove) ili sa određenim nivoom paralelizma (za konkurentne redove), sa mogućnošću sinhronizacije pristupa.
  • Zaključavanja (Locks): Različite vrste zaključavanja (NSLock, NSRecursiveLock itd.).
  • Atomičke operacije: Garantuje da se operacija (čitanje, pisanje, inkrement) izvršava atomarno, tj. ne može biti prekinuta od strane drugog niti.

U razvoju iOS-a često se koriste Grand Central Dispatch (GCD) i Operation Queues za upravljanje nitima i sprečavanje uslova trke. Serijske Dispatch Queue obezbeđuju automatsku sinhronizaciju zadataka koji se izvršavaju u toj redi.