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)
}