Junior — Middle
Vysvetlite, čo je podmienková premenná a ako sa používa na synchronizáciu vlákien.
sobes.tech AI
Odpoveď od AI
Podmienková premenná (condition variable) je mechanizmus synchronizácie vlákien, ktorý umožňuje jednému alebo viacerým vláknam čakať na splnenie určitej podmienky, zatiaľ čo iné vlákno ich o tejto zmene informuje.
V Go sú podmienkové premenné implementované pomocou typu sync.Cond. Funguje spolu s mutexom (sync.Mutex), ktorý chráni zdieľané údaje. Vlákno, ktoré chce čakať, volá Wait(), čím uvoľní mutex a zablokuje sa, kým iné vlákno nevolá Signal() (na prebudenie jedného vlákna) alebo Broadcast() (na prebudenie všetkých čakajúcich).
Príklad použitia:
var mu sync.Mutex
cond := sync.NewCond(&mu)
sharedDataReady := false
// Vlákno čakajúce
mu.Lock()
for !sharedDataReady {
cond.Wait() // uvoľní mu a čaká na signál
}
// Tu je sharedDataReady == true
mu.Unlock()
// Vlákno, ktoré mení stav
mu.Lock()
sharedDataReady = true
cond.Signal() // alebo cond.Broadcast(), na prebudenie čakajúcich
mu.Unlock()
Týmto spôsobom pomáha podmienková premenná organizovať správne čakanie a oznámenie medzi vláknami, vyhýbajúc sa aktívnemu polling a podmienkam súťaže.