Sobes.tech
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()