Sobes.tech
Middle

Como funciona a variável condicional (sync.Cond) em Go?

sobes.tech IA

Resposta da IA

No Go, sync.Cond é uma variável condicional usada para coordenar goroutines, permitindo que uma ou várias goroutines aguardem a ocorrência de uma condição específica.

Métodos principais:

  • Wait(): bloqueia a goroutine atual e libera o mutex associado, até que Signal() ou Broadcast() sejam chamados.
  • Signal(): acorda uma goroutine que está esperando na variável condicional.
  • Broadcast(): acorda todas as goroutines que estão esperando na variável condicional.

Exemplo de uso:

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

// Goroutine que espera a condição
go func() {
    mu.Lock()
    cond.Wait() // espera o sinal
    // condição atendida
    mu.Unlock()
}()

// Goroutine que sinaliza
mu.Lock()
// altera o estado que a primeira goroutine espera
cond.Signal() // ou cond.Broadcast()
mu.Unlock()

É importante que Wait() seja chamado com o mutex bloqueado, e ao chamar Wait(), o mutex é liberado temporariamente para que outras goroutines possam alterar o estado e chamar Signal() ou Broadcast(). Após o despertar, Wait() bloqueia novamente o mutex antes de retornar.

Assim, sync.Cond permite sincronizar eficientemente a execução de goroutines com base na mudança de estado.