Sobes.tech
Middle

¿Cuál es la diferencia entre RW Mutex y un mutex normal?

sobes.tech AI

Respuesta de la IA

sync.RWMutex permite que múltiples goroutines lean datos simultáneamente, pero solo una goroutine puede escribir datos a la vez. sync.Mutex bloquea el acceso para cualquier otra goroutine que intente obtener el bloqueo (ya sea lectura o escritura), hasta que la primera goroutine libere el bloqueo.

  • sync.Mutex: Bloqueo exclusivo. Está bloqueado o no. Solo una goroutine puede mantener el mutex en cualquier momento. Es adecuado cuando las operaciones de lectura y escritura se realizan con frecuencia o tienen una duración similar.

    // Ejemplo de uso de Mutex
    var mu sync.Mutex
    var counter int
    
    func increment() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
  • sync.RWMutex: Bloqueo para lectura y escritura. Permite que múltiples goroutines mantengan el bloqueo para lectura simultáneamente, pero el bloqueo para escritura es exclusivo. Una goroutine que mantiene el bloqueo para escritura bloquea tanto otras operaciones de escritura como de lectura. Las goroutines que mantienen el bloqueo para lectura bloquean las operaciones de escritura, pero no otras operaciones de lectura. Es adecuado cuando las operaciones de lectura ocurren con mucha más frecuencia que las operaciones de escritura.

    // Ejemplo de uso de RWMutex
    var rwmu sync.RWMutex
    var data map[string]string = make(map[string]string)
    
    func readData(key string) string {
        rwmu.RLock() // Obtenemos el bloqueo para lectura
        value := data[key]
        rwmu.RUnlock() // Liberamos el bloqueo para lectura
        return value
    }
    
    func writeData(key, value string) {
        rwmu.Lock() // Obtenemos el bloqueo para escritura
        data[key] = value
        rwmu.Unlock() // Liberamos el bloqueo para escritura
    }
    

Las diferencias principales se pueden resumir en la siguiente tabla:

Característica sync.Mutex sync.RWMutex
Tipo de bloqueo Exclusivo (lectura/escritura) Compartido (lectura) + exclusivo (escritura)
Acceso simultáneo Una goroutine Múltiples goroutines para lectura, una para escritura
Método de bloqueo para lectura Lock() RLock()
Método de bloqueo para escritura Lock() Lock()
Método de desbloqueo para lectura Unlock() RUnlock()
Método de desbloqueo para escritura Unlock() Unlock()
Rendimiento Más simple, potencialmente más lento en lecturas frecuentes Más complejo, potencialmente más rápido en lecturas frecuentes y escrituras raras