Sobes.tech
Middle

Na čem jsou založeny bariéry a semafory?

sobes.tech AI

Odpověď od AI

Barriéry a semafory v kontextu paralelního programování jsou založeny na mechanismech synchronizace:

  • Semafory: Jsou založeny na atomových operacích nad čítačem. Hlavní operace:

    • wait (nebo P, získat): Sníží čítač. Pokud se čítač stane záporným, vlákno je zablokováno, dokud jiné vlákno nevykoná signal.
    • signal (nebo V, uvolnit): Zvýší čítač. Pokud jsou zablokovaná vlákna, jedno z nich se probudí.
    • Semafory mohou být binární (hodnota 0 nebo 1, fungují jako mutexy) nebo čítačové (povolují omezenému počtu vláken přístup ke zdroji).
  • Barriéry: Založeny na mechanismu čekání všech účastníků. Vlákno, které dosáhne bariéry, je zablokováno, dokud nedosáhnou i ostatní vlákna zapojená do synchronizace. Jakmile všichni dosáhnou bariéry, pokračují současně.

V iOS/macOS vývoji jsou tyto koncepty implementovány pomocí frameworků pro současné programování, jako je GCD (Grand Central Dispatch) a OperationQueue.

Například v GCD:

// Příklad použití DispatchSemaphore
let semaphore = DispatchSemaphore(value: 1) // Binární semafor

// Wait (získat)
semaphore.wait()
// Přístup ke kritické sekci
semaphore.signal() // Signal (uvolnit)

Barriéry v GCD jsou implementovány pomocí barrier úloh (barrier tasks) pro konkurenční fronty:

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

// Normální úlohy
concurrentQueue.async {
    // ...
}

// Barrier úloha - vykoná se pouze, když jsou dokončeny všechny předchozí normální úlohy
// A po ní nezačnou žádné nové úlohy, dokud neskončí
concurrentQueue.async(flags: .barrier) {
    // ...
}

// Normální úlohy, které začnou po dokončení barrier úlohy
concurrentQueue.async {
    // ...
}