Sobes.tech
Middle+

¿Cómo funciona un mutex en las corutinas?

sobes.tech AI

Respuesta de la IA

El mutex (Mutex) en las corrutinas proporciona un mecanismo de exclusión mutua para proteger recursos compartidos contra accesos simultáneos por varias corrutinas.

Principio de funcionamiento:

  1. Adquisición del mutex: La corrutina que desea acceder al recurso protegido llama al método lock().
  2. Bloqueo: Si el mutex está libre, la corrutina lo adquiere sin bloquearse y continúa con la ejecución. Si el mutex está ocupado por otra corrutina, la corrutina que llama se suspende hasta que el mutex sea liberado.
  3. Liberación del mutex: Tras finalizar el trabajo con el recurso protegido, la corrutina llama al método unlock() para liberar el mutex.

Características clave en las corrutinas:

  • lock() no bloqueante (al adquirir un mutex libre): A diferencia de los hilos tradicionales, donde lock() puede bloquear todo el hilo, en las corrutinas, si el mutex está libre, la adquisición se realiza sin bloqueo.
  • Suspensión de la corrutina (cuando el mutex está ocupado): Si el mutex está ocupado, la corrutina que llama no bloquea el hilo, sino que se suspende hasta que se libere. Esto libera el hilo para ejecutar otras corrutinas.
  • Función de extensión withLock: Forma conveniente de usar el mutex, que lo adquiere y libera automáticamente, incluso si ocurre una excepción dentro del bloque.

Ejemplo de uso:

import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex

val mutex = Mutex()
var counter = 0

suspend fun incrementCounter() {
    mutex.withLock {
        // Sección crítica - recurso protegido
        counter++
        delay(10) // Simulación de trabajo
        println("Counter: $counter")
    } // El mutex se libera automáticamente aquí
}

fun main() = runBlocking {
    repeat(100) {
        launch {
            incrementCounter()
        }
    }
    delay(1000)
}

En este ejemplo, incrementCounter es una sección crítica que modifica el recurso compartido counter. El mutex garantiza que solo una corrutina tenga acceso a esta sección a la vez, evitando condiciones de carrera. El uso de withLock simplifica la gestión del mutex.