Sobes.tech
Middle

Kas yra semaforas programavimo kontekste?

sobes.tech AI

Atsakymas iš AI

Semaforas yra sinchronizacijos primityvas, kuris valdo srautų prieigą prie riboto ištekliaus. Jis palaiko sveikąjį skaičių.

Pagrindinės operacijos:

  • wait() (arba P / acquire): sumažina skaitiklį 1-uoju. Jei skaitiklis tampa neigiamas, srautas blokuojamas iki kito srauto įvykdys signal().
  • signal() (arba V / release): padidina skaitiklį 1-uoju. Jei yra užblokuotų srautų, vienas jų atblokuojamas.

Semaforų tipai:

  • Dvinaris semaforas (mutex): skaitiklis priima reikšmes 0 arba 1. Naudojamas tarpusavio išimčiai užtikrinti — tik vienas srautas gali gauti prieigą prie ištekliaus vienu metu.
  • Skaitinis semaforas: skaitiklis gali priimti reikšmes nuo 0 iki N. Naudojamas riboto išteklių pulų prieigos valdymui.

Pavyzdys Swift kalba, ribojantis vienu metu veikiančių užduočių skaičių:

// Semaforo sukūrimas, leidžiantis iki 3 vienu metu veikiančių užduočių
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Užduotis 1
    semaphore.wait() // sumažina skaitiklį, blokuoja jei > 3 užduotys veikia
    print("Užduotis 1 pradėta")
    Thread.sleep(forTimeInterval: 2) // darbo imitacija
    print("Užduotis 1 baigta")
    semaphore.signal() // padidina skaitiklį, atblokuoja laukiančias užduotis
}

DispatchQueue.global().async {
    // Užduotis 2
    semaphore.wait()
    print("Užduotis 2 pradėta")
    Thread.sleep(forTimeInterval: 3)
    print("Užduotis 2 baigta")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Užduotis 3
    semaphore.wait()
    print("Užduotis 3 pradėta")
    Thread.sleep(forTimeInterval: 1)
    print("Užduotis 3 baigta")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Užduotis 4 (laukiama, kol atlaisvės slotas)
    semaphore.wait()
    print("Užduotis 4 pradėta")
    Thread.sleep(forTimeInterval: 2)
    print("Užduotis 4 baigta")
    semaphore.signal()
}

// Laukiame visų užduočių pabaigos — demonstracijai
// Naudokite patikimesnius laukimo mechanizmus
Thread.sleep(forTimeInterval: 5)