Middle
Was ist ein Semaphore im Kontext der Programmierung?
sobes.tech KI
Antwort von AI
Ein Semaphor ist eine Primitive zur Thread-Synchronisation, die den Zugriff auf eine begrenzte Ressource steuert. Es führt einen ganzzahligen Zähler.
Hauptoperationen:
wait()(oderP/acquire) : Verringert den Zähler um 1. Wenn der Zähler negativ wird, wird der Thread blockiert, bis ein anderersignal()ausführt.signal()(oderV/release) : Erhöht den Zähler um 1. Falls blockierte Threads vorhanden sind, wird einer von ihnen freigegeben.
Arten von Semaphoren:
- Binäres Semaphor (Mutex) : Der Zähler nimmt die Werte 0 oder 1 an. Wird verwendet, um gegenseitigen Ausschluss zu gewährleisten – nur ein Thread kann gleichzeitig auf die Ressource zugreifen.
- Zählendes Semaphor : Der Zähler kann Werte von 0 bis N annehmen. Wird verwendet, um den Zugriff auf einen Pool von Ressourcen mit begrenzter Anzahl verfügbarer Elemente zu steuern.
Beispiel in Swift zur Begrenzung der gleichzeitig laufenden Aufgaben:
// Erstellen eines Semaphors, das bis zu 3 gleichzeitige Zugriffe erlaubt
let semaphore = DispatchSemaphore(value: 3)
DispatchQueue.global().async {
// Aufgabe 1
semaphore.wait() // Zähler verringern, blockieren, wenn > 3 Aufgaben laufen
print("Aufgabe 1 gestartet")
Thread.sleep(forTimeInterval: 2) // Arbeit simulieren
print("Aufgabe 1 beendet")
semaphore.signal() // Zähler erhöhen, wartende Aufgaben freigeben
}
DispatchQueue.global().async {
// Aufgabe 2
semaphore.wait()
print("Aufgabe 2 gestartet")
Thread.sleep(forTimeInterval: 3)
print("Aufgabe 2 beendet")
semaphore.signal()
}
DispatchQueue.global().async {
// Aufgabe 3
semaphore.wait()
print("Aufgabe 3 gestartet")
Thread.sleep(forTimeInterval: 1)
print("Aufgabe 3 beendet")
semaphore.signal()
}
DispatchQueue.global().async {
// Aufgabe 4 (wird warten, bis ein Slot frei wird)
semaphore.wait()
print("Aufgabe 4 gestartet")
Thread.sleep(forTimeInterval: 2)
print("Aufgabe 4 beendet")
semaphore.signal()
}
// Warten, bis alle Aufgaben abgeschlossen sind, für die Demonstration
// In echtem Code zuverlässigere Warmechnismen verwenden
Thread.sleep(forTimeInterval: 5)