Sobes.tech
Middle+

Welche Synchronisationsprimitive für Goroutines gibt es in Go?

sobes.tech KI

Antwort von AI

In Go werden die folgenden grundlegenden Primitive zur Synchronisierung von Goroutinen verwendet:

  • Mutex (sync.Mutex) — sorgt für gegenseitigen Ausschluss, indem der Zugriff auf gemeinsam genutzte Ressourcen blockiert wird.
  • RWMutex (sync.RWMutex) — Erweiterung des Mutex, die mehreren Goroutinen gleichzeitig Lesezugriff erlaubt, aber Schreibzugriffe blockiert.
  • WaitGroup (sync.WaitGroup) — ermöglicht das Warten auf das Ende einer Gruppe von Goroutinen.
  • Channel (chan) — Kanal zum Datenaustausch zwischen Goroutinen, der Synchronisation durch Nachrichtenübermittlung bietet.
  • Once (sync.Once) — stellt sicher, dass eine bestimmte Funktion nur einmal ausgeführt wird.
  • Cond (sync.Cond) — bedingte Variable für komplexere Synchronisation, z.B. das Warten auf einen bestimmten Zustand.

Beispiel für die Verwendung von WaitGroup und Mutex:

var mu sync.Mutex
var wg sync.WaitGroup
var counter int

func increment() {
    defer wg.Done()
    mu.Lock()
    counter++
    mu.Unlock()
}

func main() {
    wg.Add(3)
    go increment()
    go increment()
    go increment()
    wg.Wait()
    fmt.Println("Zähler:", counter)
}