Sobes.tech
Middle

Co je to semafor v kontextu programování?

sobes.tech AI

Odpověď od AI

Semafor je primitivní synchronizační prostředek vláken, který řídí přístup ke omezenému zdroji. Udržuje celočíselný čítač.

Hlavní operace:

  • wait() (nebo P / acquire) : Sníží čítač o 1. Pokud se čítač stane záporným, vlákno je zablokováno, dokud jiné vlákno nevykoná signal().
  • signal() (nebo V / release) : Zvýší čítač o 1. Pokud jsou zablokovaná vlákna, jedno z nich je odblokováno.

Typy semaforů:

  • Binární semafor (mutex) : Čítač nabývá hodnot 0 nebo 1. Používá se k zajištění vzájemné výlučnosti – pouze jedno vlákno může současně získat přístup ke zdroji.
  • Počítaný semafor : Čítač může nabývat hodnot od 0 do N. Používá se k řízení přístupu do fondu zdrojů s omezeným počtem dostupných prvků.

Příklad v Swift pro omezení počtu současně běžících úloh:

// Vytvoření semaforu, který povolí až 3 současné přístupy
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Úloha 1
    semaphore.wait() // Sníží čítač, blokuje, pokud je více než 3 úlohy v běhu
    print("Úloha 1 začala")
    Thread.sleep(forTimeInterval: 2) // Simulace práce
    print("Úloha 1 dokončena")
    semaphore.signal() // Zvýší čítač, odblokuje čekající úlohy
}

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

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

DispatchQueue.global().async {
    // Úloha 4 (bude čekat, dokud se neuvolní místo)
    semaphore.wait()
    print("Úloha 4 začala")
    Thread.sleep(forTimeInterval: 2)
    print("Úloha 4 dokončena")
    semaphore.signal()
}

// Čekáme na dokončení všech úloh
// V reálném kódu používejte spolehlivější mechanismy čekání
Thread.sleep(forTimeInterval: 5)