Sobes.tech
Middle

Čo je to semafor v kontexte programovania?

sobes.tech AI

Odpoveď od AI

Semafor je primitívny synchronizačný mechanizmus vlákien, ktorý riadi prístup k obmedzenému zdroju. Udržiava celé číslo-čítač.

Hlavné operácie:

  • wait() (alebo P / acquire) : Znižuje čítač o 1. Ak sa čítač stane záporným, vlákno je zablokované, kým iné vlákno nevykoná signal().
  • signal() (alebo V / release) : Zvyšuje čítač o 1. Ak sú zablokované vlákna, jedno z nich sa odblokuje.

Typy semaforov:

  • Binárny semafor (mutex) : Čítač nadobúda hodnoty 0 alebo 1. Používa sa na zabezpečenie vzájomného vylúčenia – iba jedno vlákno môže získať prístup ku zdroju naraz.
  • Počítaný semafor : Čítač môže nadobúdať hodnoty od 0 do N. Používa sa na riadenie prístupu k fondu zdrojov s obmedzeným počtom dostupných prvkov.

Príklad v Swift na obmedzenie počtu súčasne bežiacich úloh:

// Vytvorenie semaforu, ktorý umožňuje až 3 súčasné prístupy
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Úloha 1
    semaphore.wait() // Znižuje čítač, blokuje ak je > 3 úlohy v behu
    print("Úloha 1 začala")
    Thread.sleep(forTimeInterval: 2) // Simulácia práce
    print("Úloha 1 ukončená")
    semaphore.signal() // Zvyšuje čítač, odblokuje čakajúce úlohy
}

DispatchQueue.global().async {
    // Úloha 2
    semaphore.wait()
    print("Úloha 2 začala")
    Thread.sleep(forTimeInterval: 3)
    print("Úloha 2 ukončená")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Úloha 3
    semaphore.wait()
    print("Úloha 3 začala")
    Thread.sleep(forTimeInterval: 1)
    print("Úloha 3 ukončená")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Úloha 4 (bude čakať, kým sa neuvoľní miesto)
    semaphore.wait()
    print("Úloha 4 začala")
    Thread.sleep(forTimeInterval: 2)
    print("Úloha 4 ukončená")
    semaphore.signal()
}

// Čakáme na dokončenie všetkých úloh
// V reálnom kóde používajte spoľahlivejšie mechanizmy čakania
Thread.sleep(forTimeInterval: 5)