Middle
Mire alapozódnak a korlátok és a jelzők?
sobes.tech MI
Válasz az MI-től
A párhuzamos programozás kontextusában a barrier-ek és a semaforok szinkronizációs mechanizmusokon alapulnak:
-
Semaforok: atom műveleteken alapulnak egy számlálón. Fő műveletek:
wait(vagyP,szerzés): Csökkenti a számlálót. Ha a számláló negatív lesz, a szál blokkolódik, amíg egy másik szál nem hajt végresignal-t.signal(vagyV,felszabadítás): Növeli a számlálót. Ha blokkolt szálak vannak, az egyik felébred.- A semaforok lehetnek binárisak (érték 0 vagy 1, mutexként működnek) vagy számlálók (korlátozott számú szál férhet hozzá az erőforráshoz).
-
Barrier-ek: Minden résztvevő várakozásán alapuló mechanizmus. Egy szál, amely eléri a barrier-t, blokkolódik, amíg az összes többi résztvevő is el nem éri ezt a barrier-t. Miután mindenki eléri, egyszerre folytatják.
Az iOS/macOS fejlesztésben ezeket a fogalmakat a GCD (Grand Central Dispatch) és az OperationQueue keretrendszerek segítségével valósítják meg.
Például GCD-ben:
// DispatchSemaphore használatának példája
let semaphore = DispatchSemaphore(value: 1) // Bináris semafor
// Wait (szerzés)
semaphore.wait()
// Kritikus szekcióhoz való hozzáférés
semaphore.signal() // Signal (felszabadítás)
A barrier-ek GCD-ben barrier feladatok (barrier tasks) segítségével valósulnak meg a párhuzamos soroknál:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
// Normál feladatok
concurrentQueue.async {
// ...
}
// Barrier feladat - csak akkor hajtódik végre, amikor az összes előző normál feladat befejeződött
// És ezután nem kezdődnek új feladatok, amíg ez be nem fejeződik
concurrentQueue.async(flags: .barrier) {
// ...
}
// Normál feladatok, amelyek a barrier feladat befejezése után kezdődnek
concurrentQueue.async {
// ...
}