Sobes.tech
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 (alebo P, získať): Znižuje čítač. Ak sa čítač stane záporným, vlákno je zablokované, kým iné vlákno nevykoná signal.
    • signal (alebo V, 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 {
    // ...
}