Middle
Mis on semafor programmeerimise kontekstis?
sobes.tech AI
Vastus AI-lt
Semafor on sünkroniseerimise primitiiv, mis juhib voogude juurdepääsu piiratud ressursile. See hoiab kogu arvulise loenduri.
Põhitoimingud:
wait()(võiP/acquire): vähendab loendurit 1-iga. Kui loendur muutub negatiivseks, blokeeritakse voog kuni teine voog täidabsignal().signal()(võiV/release): suurendab loendurit 1-iga. Kui on blokeeritud vooge, üks neist vabastatakse.
Semafori tüübid:
- Binaarne semafor (mutex): loendur võtab väärtused 0 või 1. Kasutatakse vastastikuse välistamise tagamiseks — ainult üks voog saab samaaegselt ressursile ligi.
- Loendamise semafor: loendur võib võtta väärtusi 0 kuni N. Kasutatakse piiratud ressursside paki juurdepääsu haldamiseks.
Näide Swiftis, mis piirab samaaegselt töötavate ülesannete arvu:
// Semafori loomine, mis lubab kuni 3 samaaegset juurdepääsu
let semaphore = DispatchSemaphore(value: 3)
DispatchQueue.global().async {
// Ülesanne 1
semaphore.wait() // vähendab loendurit, blokeerib kui > 3 ülesannet töötavad
print("Ülesanne 1 algas")
Thread.sleep(forTimeInterval: 2) // töö imiteerimine
print("Ülesanne 1 lõpetas")
semaphore.signal() // suurendab loendurit, vabastab ootavad ülesanded
}
DispatchQueue.global().async {
// Ülesanne 2
semaphore.wait()
print("Ülesanne 2 algas")
Thread.sleep(forTimeInterval: 3)
print("Ülesanne 2 lõpetas")
semaphore.signal()
}
DispatchQueue.global().async {
// Ülesanne 3
semaphore.wait()
print("Ülesanne 3 algas")
Thread.sleep(forTimeInterval: 1)
print("Ülesanne 3 lõpetas")
semaphore.signal()
}
DispatchQueue.global().async {
// Ülesanne 4 (ootab, kuni vaba slot)
semaphore.wait()
print("Ülesanne 4 algas")
Thread.sleep(forTimeInterval: 2)
print("Ülesanne 4 lõpetas")
semaphore.signal()
}
// Ootame kõigi ülesannete lõpetamist — näitamiseks
// Kasutage usaldusväärsemaid ootamise mehhanisme
Thread.sleep(forTimeInterval: 5)