Sobes.tech
Middle

Hogyan működik a feltételes változó (sync.Cond) Go-ban?

sobes.tech MI

Válasz az MI-től

Go nyelvben a sync.Cond egy feltételes változó, amelyet goroutine-ok koordinálására használnak, lehetővé téve egy vagy több goroutine számára, hogy várakozzanak egy adott feltétel bekövetkezésére.

Főbb módszerek:

  • Wait(): blokkolja az aktuális goroutine-t és felszabadítja a kapcsolódó mutexet, amíg Signal() vagy Broadcast() nem kerül meghívásra.
  • Signal(): felébreszt egy goroutine-t, amely a feltételes változón várakozik.
  • Broadcast(): felébreszti az összes goroutine-t, amely a feltételes változón várakozik.

Használati példa:

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

// Goroutine, amely vár a feltételre
go func() {
    mu.Lock()
    cond.Wait() // vár a jelzésre
    // a feltétel teljesült
    mu.Unlock()
}()

// Goroutine, amely jelzést küld
mu.Lock()
// megváltoztatja az állapotot, amit az első goroutine vár
cond.Signal() // vagy cond.Broadcast()
mu.Unlock()

Fontos, hogy a Wait() hívás mutexzárva legyen, és a Wait() hívásakor a mutex ideiglenesen felszabadul, hogy más goroutine-ok megváltoztathassák az állapotot és hívhassák a Signal() vagy Broadcast() metódusokat. A felébredés után a Wait() újra zárolja a mutexet, mielőtt visszatérne.

Így a sync.Cond hatékonyan szinkronizálja a goroutine-ok végrehajtását az állapotváltozások alapján.