Middle+
Comment fonctionne un mutex dans les coroutines?
sobes.tech IA
Réponse de l'IA
Un mutex (Mutual Exclusion) dans les coroutines fournit un mécanisme d’exclusion mutuelle pour protéger les ressources partagées contre un accès simultané par plusieurs coroutines.
Principe de fonctionnement :
- Prise du mutex : La coroutine qui souhaite accéder à la ressource protégée appelle la méthode
lock(). - Verrouillage : Si le mutex est libre, la coroutine le prend sans bloquer et continue l’exécution. Si le mutex est occupé par une autre coroutine, la coroutine appelante est suspendue jusqu’à ce que le mutex soit libéré.
- Libération du mutex : Après avoir terminé avec la ressource protégée, la coroutine appelle la méthode
unlock()pour libérer le mutex.
Caractéristiques clés dans les coroutines :
lock()non bloquant (lorsqu’un mutex libre est pris) : Contrairement aux threads traditionnels, oùlock()peut bloquer tout le thread, dans les coroutines, si le mutex est libre, la prise se fait sans blocage.- Suspension de la coroutine (lorsque le mutex est occupé) : Si le mutex est occupé, la coroutine qui appelle ne bloque pas le thread, mais est suspendue jusqu’à sa libération. Cela libère le thread pour exécuter d’autres coroutines.
- Fonction d’extension
withLock: Méthode pratique pour utiliser le mutex, qui le prend et le libère automatiquement, même en cas d’exception dans le bloc.
Exemple d’utilisation :
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
// Section critique - ressource protégée
counter++
delay(10) // Simulation de travail
println("Counter: $counter")
} // Le mutex est libéré automatiquement ici
}
fun main() = runBlocking {
repeat(100) {
launch {
incrementCounter()
}
}
delay(1000)
}
Dans cet exemple, incrementCounter est une section critique qui modifie la ressource partagée counter. Le mutex garantit qu’une seule coroutine a accès à cette section à la fois, évitant ainsi les conditions de course. L’utilisation de withLock simplifie la gestion du mutex.