Sobes.tech
Middle

На какво се основават бариерите и семафорите?

sobes.tech AI

Отговор от AI

Бариери и семафори в контекста на паралелното програмиране се базират на механизми за синхронизация:

  • Семафори: Основават се на атомарни операции върху брояч. Основни операции:

    • wait (или P, записване): Намалява брояча. Ако броячът стане отрицателен, нишката се блокира, докато друга нишка не изпълни signal.
    • signal (или V, освобождаване): Увеличава брояча. Ако има блокирани нишки, една от тях се събужда.
    • Семафорите могат да бъдат бинарни (стойност 0 или 1, действат като мьютекси) или броячни (позволяват ограничен брой нишки да имат достъп до ресурс).
  • Бариери: Основават се на механизъм за очакване от всички участници. Нишката, достигнала бариерата, се блокира, докато всички други участници също не достигнат тази бариера. След като всички достигнат, те продължават едновременно.

В разработката за iOS/macOS тези концепции се реализират чрез frameworks за паралелно програмиране като GCD (Grand Central Dispatch) и OperationQueue.

Например, в GCD:

// Пример за използване на DispatchSemaphore
let semaphore = DispatchSemaphore(value: 1) // Бинарен семафор

// Wait (записване)
semaphore.wait()
// Достъп до критичната секция
semaphore.signal() // Signal (освобождаване)

Бариерата в GCD се реализира чрез barrier задачи за паралелни опашки:

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

// Обикновени задачи
concurrentQueue.async {
    // ...
}

// Бариера задача - изпълнява се само когато всички предишни обикновени задачи са завършили
// И след това, нови задачи няма да започнат, докато тя не приключи
concurrentQueue.async(flags: .barrier) {
    // ...
}

// Обикновени задачи, които ще започнат след приключване на бариера
concurrentQueue.async {
    // ...
}