Senior
Que primitivas de sincronização conhece?
sobes.tech IA
Resposta da IA
Em Go, existem várias primitivas principais de sincronização para gerir o acesso concorrente aos recursos:
- Mutex (sync.Mutex) — garante exclusão mútua, bloqueando o acesso à secção crítica.
- RWMutex (sync.RWMutex) — mutex estendido que permite a múltiplos leitores lerem simultaneamente, mas bloqueia a escrita.
- WaitGroup (sync.WaitGroup) — permite aguardar que um grupo de goroutines termine.
- Cond (sync.Cond) — variável condicional para notificar as goroutines sobre a ocorrência de um evento.
- Operações atómicas (sync/atomic) — operações de baixo nível para leitura e escrita atómicas de variáveis.
Além disso, em Go, são amplamente utilizados canal (channels), que permitem sincronizar goroutines e transmitir dados entre elas sem usar mutexes explicitamente.
Exemplo de uso de Mutex:
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}
Exemplo de uso de WaitGroup:
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
// trabalho
}()
go func() {
defer wg.Done()
// trabalho
}()
wg.Wait()