Sobes.tech
Junior — Middle

Wyjaśnij, czym jest zmienna warunkowa i jak jest używana do synchronizacji wątków.

sobes.tech AI

Odpowiedź od AI

Zmienna warunkowa (condition variable) to mechanizm synchronizacji wątków, który pozwala jednemu lub wielu wątkom oczekiwać na spełnienie określonego warunku, podczas gdy inny wątek informuje ich o zmianie stanu.

W Go zmienne warunkowe są implementowane za pomocą typu sync.Cond. Działa ona razem z mutexem (sync.Mutex), który chroni dane współdzielone. Wątek, który chce czekać, wywołuje Wait(), co zwalnia mutex i blokuje się do momentu, gdy inny wątek wywoła Signal() (aby obudzić jeden wątek) lub Broadcast() (aby obudzić wszystkie oczekujące).

Przykład użycia:

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

// Wątek oczekujący
mu.Lock()
for !sharedDataReady {
    cond.Wait() // zwalnia mu i czeka na sygnał
}
// Tutaj sharedDataReady == true
mu.Unlock()

// Wątek zmieniający stan
mu.Lock()
sharedDataReady = true
cond.Signal() // lub cond.Broadcast(), aby obudzić oczekujących
mu.Unlock()

W ten sposób zmienna warunkowa pomaga zorganizować poprawne oczekiwanie i powiadomienie między wątkami, unikając aktywnego pollingowania i warunków wyścigu.