Middle
Kuo grindžiamos barjerai ir semaforai?
sobes.tech AI
Atsakymas iš AI
Lygiagrečios programavimo kontekste barjerai ir semaforai grindžiami sinchronizacijos mechanizmais:
-
Semaforai: grindžiami atominių operacijų skaičiuoklėmis. Pagrindinės operacijos:
wait(arbaP,acquire): sumažina skaičiuoklę. Jei skaičiuoklė tampa neigiama, srautas blokuojamas, kol kitas srautas įvykdyssignal.signal(arbaV,release): padidina skaičiuoklę. Jei yra užblokuotų srautų, vienas jų pažadinamas.- Semaforai gali būti binariniai (reikšmė 0 arba 1, veikia kaip mutuokliai) arba skaičiuojami (leidžia ribotam srautų skaičiui pasiekti išteklių).
-
Barjerai: grindžiami visų dalyvių laukimo mechanizmu. Srautas, pasiekęs barjerą, blokuojamas, kol visi kiti dalyviai, dalyvaujantys sinchronizacijoje, taip pat pasieks šį barjerą. Kai visi pasiekia, jie vienu metu tęsia darbą.
Šios koncepcijos įgyvendinamos iOS/macOS programavime naudojant GCD (Grand Central Dispatch) ir OperationQueue karkasus:
Pavyzdžiui, GCD:
// Pavyzdys naudojant DispatchSemaphore
let semaphore = DispatchSemaphore(value: 1) // Binarinis semaforas
// Laukimas (acquire)
semaphore.wait()
// Kritinės sekcijos vykdymas
semaphore.signal() // Signalas (release)
GCD barjerai įgyvendinami naudojant barjerines užduotis (barrier tasks) bendrose eilėse:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
// Įprastos užduotys
concurrentQueue.async {
// ...
}
// Barjerinė užduotis - vykdoma tik tada, kai baigiamos visos ankstesnės įprastos užduotys
// ir po to naujos užduotys nepradės vykdyti, kol ši nebaigsis
concurrentQueue.async(flags: .barrier) {
// ...
}
// Įprastos užduotys, kurios pradės vykdyti po barjerinės užduoties pabaigos
concurrentQueue.async {
// ...
}