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()(neboP/acquire) : Sníží čítač o 1. Pokud se čítač stane záporným, vlákno je zablokováno, dokud jiné vlákno nevykonásignal().signal()(neboV/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)