Sobes.tech
Middle+

Quais primitivas de sincronização de goroutines existem em Go?

sobes.tech IA

Resposta da IA

Em Go, as principais primitivas usadas para sincronizar goroutines são:

  • Mutex (sync.Mutex) — garante exclusão mútua, bloqueando o acesso a recursos partilhados.
  • RWMutex (sync.RWMutex) — extensão do Mutex que permite a várias goroutines lerem simultaneamente, mas bloqueia a escrita.
  • WaitGroup (sync.WaitGroup) — permite esperar que um conjunto de goroutines termine.
  • Channel (chan) — canal para transmissão de dados entre goroutines, fornece sincronização através do envio de mensagens.
  • Once (sync.Once) — garante que uma função específica seja executada apenas uma vez.
  • Cond (sync.Cond) — variável condicional para sincronização mais complexa, como esperar por um estado específico.

Exemplo de uso de WaitGroup e Mutex:

var mu sync.Mutex
var wg sync.WaitGroup
var counter int

func increment() {
    defer wg.Done()
    mu.Lock()
    counter++
    mu.Unlock()
}

func main() {
    wg.Add(3)
    go increment()
    go increment()
    go increment()
    wg.Wait()
    fmt.Println("Contador:", counter)
}