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(iliP,kupi): Smanjuje brojač. Ako brojač postane negativan, nit se blokira dok druga nit ne izvršisignal.signal(iliV,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 {
// ...
}