Middle
Na čom sú založené bariéry a semafory?
sobes.tech AI
Odpoveď od AI
Barriéry a semafory v kontexte paralelného programovania sú založené na mechanizmoch synchronizácie:
-
Semafory: Sú založené na atómových operáciách nad čítačom. Hlavné operácie:
wait(aleboP,získať): Znižuje čítač. Ak sa čítač stane záporným, vlákno je zablokované, kým iné vlákno nevykonásignal.signal(aleboV,uvoľniť): Zvyšuje čítač. Ak sú zablokované vlákna, jedno z nich sa prebudí.- Semafory môžu byť binárne (hodnota 0 alebo 1, fungujú ako mutexy) alebo čítačové (povoľujú obmedzenému počtu vlákien prístup ku zdroju).
-
Barriéry: Sú založené na mechanizme čakania od všetkých účastníkov. Vlákno, ktoré dosiahne bariéru, je zablokované, kým všetky ostatné vlákna zapojené do synchronizácie nedosiahnu aj túto bariéru. Po dosiahnutí všetkými, pokračujú súčasne.
V vývoji pre iOS/macOS sú tieto koncepty implementované pomocou frameworkov pre paralelné programovanie ako GCD (Grand Central Dispatch) a OperationQueue.
Napríklad v GCD:
// Príklad použitia DispatchSemaphore
let semaphore = DispatchSemaphore(value: 1) // Binárny semafor
// Wait (získať)
semaphore.wait()
// Prístup ku kritickej sekcii
semaphore.signal() // Signal (uvoľniť)
Barriéry v GCD sú implementované pomocou barrier úloh (barrier tasks) pre paralelné fronty:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
// Bežné úlohy
concurrentQueue.async {
// ...
}
// Barrier úloha - vykoná sa iba keď všetky predchádzajúce bežné úlohy skončia
// A po tom, žiadne nové úlohy nezačnú, kým sa táto nedokončí
concurrentQueue.async(flags: .barrier) {
// ...
}
// Bežné úlohy, ktoré začnú po dokončení barrier úlohy
concurrentQueue.async {
// ...
}