Sobes.tech
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 (vagy P, 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égre signal-t.
    • signal (vagy V, 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 {
    // ...
}