Sobes.tech
Middle

Wie funktioniert die bedingte Variable (sync.Cond) in Go?

sobes.tech KI

Antwort von AI

In Go ist sync.Cond eine Konditionsvariable, die zur Koordination von Goroutines verwendet wird, sodass eine oder mehrere Goroutines auf das Eintreten einer bestimmten Bedingung warten können.

Hauptmethoden:

  • Wait(): blockiert die aktuelle Goroutine und gibt das zugehörige Mutex frei, bis Signal() oder Broadcast() aufgerufen werden.
  • Signal(): weckt eine Goroutine, die auf der Konditionsvariable wartet.
  • Broadcast(): weckt alle Goroutines, die auf der Konditionsvariable warten.

Anwendungsbeispiel:

var mu sync.Mutex
cond := sync.NewCond(&mu)

// Goroutine, die auf die Bedingung wartet
go func() {
    mu.Lock()
    cond.Wait() // wartet auf das Signal
    // Bedingung erfüllt
    mu.Unlock()
}()

// Goroutine, die signalisiert
mu.Lock()
// ändert den Zustand, auf den die erste Goroutine wartet
cond.Signal() // oder cond.Broadcast()
mu.Unlock()

Wichtig ist, dass Wait() mit gehaltenem Mutex aufgerufen wird, und bei Aufruf von Wait() wird das Mutex vorübergehend freigegeben, damit andere Goroutines den Zustand ändern und Signal() oder Broadcast() aufrufen können. Nach dem Aufwachen sperrt Wait() das Mutex wieder, bevor es zurückkehrt.

Auf diese Weise ermöglicht sync.Cond eine effiziente Synchronisation der Goroutine-Ausführung basierend auf Zustandsänderungen.