Sobes.tech
Middle+

Ce primitive de sincronizare a goroutine-urilor există în Go?

sobes.tech AI

Răspuns de la AI

În Go, primitivele principale utilizate pentru sincronizarea gorutinelor sunt:

  • Mutex (sync.Mutex) — asigură excluderea reciprocă, blocând accesul la resursele partajate.
  • RWMutex (sync.RWMutex) — extindere a Mutex, permite mai multor gorutine să citească simultan, dar blochează scrierea.
  • WaitGroup (sync.WaitGroup) — permite așteptarea finalizării unui set de gorutine.
  • Channel (chan) — canal pentru transmiterea datelor între gorutine, asigură sincronizarea prin transmiterea mesajelor.
  • Once (sync.Once) — garantează că o anumită funcție va fi executată o singură dată.
  • Cond (sync.Cond) — variabilă condițională pentru sincronizare mai complexă, de exemplu, așteptarea unui anumit stat.

Exemplu de utilizare a WaitGroup și 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("Counter:", counter)
}