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()(arbaP/acquire): sumažina skaitiklį 1-uoju. Jei skaitiklis tampa neigiamas, srautas blokuojamas iki kito srauto įvykdyssignal().signal()(arbaV/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)