Sobes.tech
Middle

Jak działa zmienna warunkowa (sync.Cond) w Go?

sobes.tech AI

Odpowiedź od AI

W języku Go, sync.Cond to zmienna warunkowa używana do koordynacji gorutyn, umożliwiająca jednej lub wielu gorutynom oczekiwanie na spełnienie określonego warunku.

Główne metody:

  • Wait(): blokuje bieżącą gorutynę i zwalnia powiązany mutex, aż do wywołania Signal() lub Broadcast().
  • Signal(): budzi jedną gorutynę oczekującą na zmiennej warunkowej.
  • Broadcast(): budzi wszystkie gorutiny oczekujące na zmiennej warunkowej.

Przykład użycia:

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

// Gorutyna oczekująca na warunek
go func() {
    mu.Lock()
    cond.Wait() // czeka na sygnał
    // warunek spełniony
    mu.Unlock()
}()

// Gorutyna wysyłająca sygnał
mu.Lock()
// zmienia stan, na który czeka pierwsza gorutyna
cond.Signal() // lub cond.Broadcast()
mu.Unlock()

Ważne, aby Wait() było wywoływane z zablokowanym mutexem, a podczas wywołania Wait(), mutex jest tymczasowo zwalniany, aby inne gorutiny mogły zmienić stan i wywołać Signal() lub Broadcast(). Po przebudzeniu, Wait() ponownie blokuje mutex przed powrotem.

W ten sposób, sync.Cond pozwala efektywnie synchronizować wykonywanie gorutyn na podstawie zmiany stanu.