Sobes.tech
Junior — Middle

Magyarázza el, mi az a feltételes változó, és hogyan használják a szálak szinkronizálására.

sobes.tech MI

Válasz az MI-től

A feltételváltozó (condition variable) egy szálak közötti szinkronizációs mechanizmus, amely lehetővé teszi egy vagy több szálnak, hogy egy adott feltétel bekövetkeztéig várakozzanak, miközben egy másik szál értesíti őket az állapotváltozásról.

Go-ban a feltételváltozókat a sync.Cond típus valósítja meg. Ez egy sync.Mutex-szel együtt működik, amely védi a megosztott adatokat. A várakozó szál a Wait()-ot hívja, ami felszabadítja a mutexet és blokkolódik, amíg egy másik szál nem hívja a Signal()-t (egy szál felébresztésére) vagy a Broadcast()-ot (minden várakozó felébresztése).

Használati példa:

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

// Várakozó szál
mu.Lock()
for !sharedDataReady {
    cond.Wait() // felszabadítja a mu-t és vár a jelre
}
// Itt sharedDataReady == true
mu.Unlock()

// Állapotot módosító szál
mu.Lock()
sharedDataReady = true
cond.Signal() // vagy cond.Broadcast(), hogy felébressze a várakozókat
mu.Unlock()

Így a feltételváltozó segít a helyes várakozás és értesítés szervezésében a szálak között, elkerülve az aktív pollingot és a versenyhelyzeteket.