Middle
Wat is een semaphore in de context van programmeren?
sobes.tech AI
Antwoord van AI
Een semaphore is een primitieve synchronisatie van threads die de toegang tot een beperkte bron beheert. Het houdt een geheel getal teller bij.
Belangrijkste operaties:
wait()(ofP/acquire) : Verlaagt de teller met 1. Als de teller negatief wordt, wordt de thread geblokkeerd totdat een anderesignal()uitvoert.signal()(ofV/release) : Verhoogt de teller met 1. Als er geblokkeerde threads zijn, wordt er een ontgrendeld.
Types semaforen:
- Binaire semafoor (mutex) : De teller neemt de waarden 0 of 1 aan. Wordt gebruikt om onderlinge uitsluiting te garanderen – slechts één thread kan gelijktijdig toegang krijgen tot de bron.
- Telbare semafoor : De teller kan waarden aannemen van 0 tot N. Wordt gebruikt om toegang te beheren tot een pool van bronnen met een beperkt aantal beschikbare elementen.
Voorbeeld in Swift om het aantal taken dat gelijktijdig kan worden uitgevoerd te beperken:
// Creëer een semaphore die tot 3 gelijktijdige toegang toestaat
let semaphore = DispatchSemaphore(value: 3)
DispatchQueue.global().async {
// Taak 1
semaphore.wait() // Verlaagt de teller, blokkeert als er meer dan 3 taken actief zijn
print("Taak 1 gestart")
Thread.sleep(forTimeInterval: 2) // Simulatie van werk
print("Taak 1 voltooid")
semaphore.signal() // Verhoogt de teller, ontgrendelt wachtende taken
}
DispatchQueue.global().async {
// Taak 2
semaphore.wait()
print("Taak 2 gestart")
Thread.sleep(forTimeInterval: 3)
print("Taak 2 voltooid")
semaphore.signal()
}
DispatchQueue.global().async {
// Taak 3
semaphore.wait()
print("Taak 3 gestart")
Thread.sleep(forTimeInterval: 1)
print("Taak 3 voltooid")
semaphore.signal()
}
DispatchQueue.global().async {
// Taak 4 (wacht tot er een plek vrij is)
semaphore.wait()
print("Taak 4 gestart")
Thread.sleep(forTimeInterval: 2)
print("Taak 4 voltooid")
semaphore.signal()
}
// Wacht tot alle taken klaar zijn voor de demonstratie
// Gebruik betrouwbaardere wachtmechanismen in echte code
Thread.sleep(forTimeInterval: 5)