Middle
Pe ce se bazează barierele și semafoarele?
sobes.tech AI
Răspuns de la AI
Barierile și semafoarele în contextul programării paralele se bazează pe mecanisme de sincronizare:
-
Semaforii: Se bazează pe operații atomice asupra unui contor. Operațiile principale:
wait(sauP,achiziție): Decrementarea contorului. Dacă contorul devine negativ, firul de execuție se blochează până când alt fir efectueazăsignal.signal(sauV,eliberare): Incrementarea contorului. Dacă există fire blocate, unul dintre ele se trezește.- Semaforii pot fi binari (valoare 0 sau 1, acționează ca mutex-uri) sau contabili (permit unui număr limitat de fire să acceseze resursa).
-
Barieră: Se bazează pe un mecanism de așteptare de către toți participanții. Un fir care atinge bariera se blochează până când toți ceilalți participanți la sincronizare ating și ei această barieră. După ce toți ating bariera, continuă simultan.
În dezvoltarea iOS/macOS, aceste concepte sunt implementate folosind framework-uri de programare concurentă, cum ar fi GCD (Grand Central Dispatch) și OperationQueue.
De exemplu, în GCD:
// Exemplu de utilizare a DispatchSemaphore
let semaphore = DispatchSemaphore(value: 1) // Semafor binar
// Wait (achiziție)
semaphore.wait()
// Acces la secțiunea critică
semaphore.signal() // Semnal (eliberare)
Barierile în GCD sunt implementate cu ajutorul task-urilor de tip barrier pentru cozi concurente:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
// Task-uri normale
concurrentQueue.async {
// ...
}
// Task de tip barrier - se execută doar când toate task-urile normale anterioare s-au terminat
// Și după aceasta, nu vor începe noi task-uri până când nu se termină
concurrentQueue.async(flags: .barrier) {
// ...
}
// Task-uri normale care vor începe după finalizarea task-ului barrier
concurrentQueue.async {
// ...
}