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