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()(aleboP/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()(aleboV/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)