Sobes.tech
Middle+

¿Qué primitivas de sincronización de goroutines existen en Go?

sobes.tech AI

Respuesta de la IA

En Go, los principales primitivas utilizados para sincronizar goroutines son:

  • Mutex (sync.Mutex) — garantiza exclusión mutua, bloqueando el acceso a recursos compartidos.
  • RWMutex (sync.RWMutex) — extensión de Mutex que permite a varias goroutines leer simultáneamente, pero bloquea la escritura.
  • WaitGroup (sync.WaitGroup) — permite esperar a que un conjunto de goroutines finalice.
  • Channel (chan) — canal para transmitir datos entre goroutines, proporciona sincronización mediante el envío de mensajes.
  • Once (sync.Once) — garantiza que una función específica se ejecute solo una vez.
  • Cond (sync.Cond) — variable condicional para sincronización más compleja, como esperar a un estado específico.

Ejemplo de uso de WaitGroup y 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("Contador:", counter)
}