Sobes.tech
Middle

Na čemu se zasnivaju barijere i semafori?

sobes.tech АИ

Одговор од АИ

Barijeri i semafori u kontekstu paralelnog programiranja zasnivaju se na mehanizmima sinhronizacije:

  • Semafori: Osnivaju se na atomskim operacijama nad brojačem. Glavne operacije:

    • wait (ili P, kupi): Smanjuje brojač. Ako brojač postane negativan, nit se blokira dok druga nit ne izvrši signal.
    • signal (ili V, oslobađanje): Povećava brojač. Ako postoje blokirane niti, jedna od njih se probudi.
    • Semafori mogu biti binarni (vrednost 0 ili 1, deluju kao mutexi) ili brojački (dozvoljavaju ograničenom broju niti da pristupe resursu).
  • Barijere: Osnivaju se na mehanizmu čekanja od strane svih učesnika. Nit koja dostigne barijeru se blokira dok sve ostale niti uključene u sinhronizaciju ne dostignu i one. Nakon što svi dostignu barijeru, nastavljaju istovremeno.

U razvoju za iOS/macOS, ove koncepte implementiraju pomoću frameworka za konkurentno programiranje kao što su GCD (Grand Central Dispatch) i OperationQueue.

Na primer, u GCD:

// Primer korišćenja DispatchSemaphore
let semaphore = DispatchSemaphore(value: 1) // Binarni semafor

// Wait (kupi)
semaphore.wait()
// Pristup kritičnom delu
semaphore.signal() // Signal (oslobađanje)

Barijere u GCD se implementiraju pomoću barrier zadataka za konkurentne redove:

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

// Obične zadatke
concurrentQueue.async {
    // ...
}

// Barrier zadatak - izvršava se samo kada su svi prethodni obični zadaci završeni
// I nakon toga, novi zadaci neće početi dok se ovaj ne završi
concurrentQueue.async(flags: .barrier) {
    // ...
}

// Obični zadaci koji će početi nakon završetka barrier zadatka
concurrentQueue.async {
    // ...
}