Sobes.tech
Junior — Middle

Vysvětlete, co je podmíněná proměnná a jak se používá k synchronizaci vláken.

sobes.tech AI

Odpověď od AI

Podmínková proměnná (condition variable) je mechanismus synchronizace vláken, který umožňuje jednomu nebo více vláknům čekat na splnění určité podmínky, zatímco jiné vlákno je o této změně informuje.

V Go jsou podmínkové proměnné implementovány pomocí typu sync.Cond. Funguje spolu s mutexem (sync.Mutex), který chrání sdílená data. Vlákno, které chce čekat, volá Wait(), čímž uvolní mutex a zablokuje se, dokud jiné vlákno nevolá Signal() (pro probuzení jednoho vlákna) nebo Broadcast() (pro probuzení všech čekajících).

Příklad použití:

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

// Vlákno čekající
mu.Lock()
for !sharedDataReady {
    cond.Wait() // uvolní mu a čeká na signál
}
// Zde je sharedDataReady == true
mu.Unlock()

// Vlákno, které mění stav
mu.Lock()
sharedDataReady = true
cond.Signal() // nebo cond.Broadcast(), pro probuzení čekajících
mu.Unlock()

Tímto způsobem pomáhá podmínková proměnná organizovat správné čekání a oznámení mezi vlákny, čímž se předchází aktivnímu pollingu a závodním podmínkám.