Sobes.tech
Senior

Ce primitive de sincronizare cunoașteți?

sobes.tech AI

Răspuns de la AI

În Go, există mai multe primitive principale de sincronizare pentru gestionarea accesului concurent la resurse:

  • Mutex (sync.Mutex) — asigură excluderea mutuală, blocând accesul la secțiunea critică.
  • RWMutex (sync.RWMutex) — mutex extins care permite mai multor cititori să citească simultan, dar blochează scrierea.
  • WaitGroup (sync.WaitGroup) — permite așteptarea finalizării unui grup de goroutines.
  • Cond (sync.Cond) — variabilă condițională pentru notificarea goroutines despre apariția unui eveniment.
  • Operații atomice (sync/atomic) — operații de nivel inferior pentru citirea și scrierea atomică a variabilelor.

De asemenea, în Go se utilizează pe scară largă canale (channels), care permit sincronizarea goroutines și transmiterea datelor între ele fără utilizarea explicită a mutexurilor.

Exemplu de utilizare a Mutex:

var mu sync.Mutex
var counter int

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

Exemplu de utilizare a WaitGroup:

var wg sync.WaitGroup
wg.Add(2)
go func() {
    defer wg.Done()
    // lucru
}()
go func() {
    defer wg.Done()
    // lucru
}()
wg.Wait()