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:
- Adquisición del mutex: La corrutina que desea acceder al recurso protegido llama al método
lock(). - 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.
- 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, dondelock()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.