Sobes.tech
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() (oder P / acquire) : Verringert den Zähler um 1. Wenn der Zähler negativ wird, wird der Thread blockiert, bis ein anderer signal() ausführt.
  • signal() (oder V / 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)