Middle+
Cum funcționează un mutex în corutine?
sobes.tech AI
Răspuns de la AI
Un mutex (Mutual Exclusion) în corutine oferă un mecanism de excludere mutuală pentru protejarea resurselor comune împotriva accesului simultan de către mai multe corutine.
Principiul de funcționare:
- Preluarea mutex-ului: Corutina care dorește să acceseze resursa protejată apelează metoda
lock(). - Blocarea: Dacă mutex-ul este liber, corutina îl preia fără a se bloca și continuă execuția. Dacă mutex-ul este ocupat de o altă corutină, corutina apelantă este suspendată până când mutex-ul este eliberat.
- Eliberarea mutex-ului: După finalizarea lucrului cu resursa protejată, corutina apelează metoda
unlock()pentru a elibera mutex-ul.
Caracteristici cheie în corutine:
lock()ne-blocant (la preluarea unui mutex liber): Spre deosebire de firele tradiționale, undelock()poate bloca întregul fir, în corutine, dacă mutex-ul este liber, preluarea se face fără blocare.- Suspendarea corutinei (când mutex-ul este ocupat): Dacă mutex-ul este ocupat, corutina care apelează nu blochează firul, ci se suspendă până când este eliberat. Acest lucru eliberează firul pentru alte corutine.
- Funcția de extensie
withLock: Mod convenabil de a folosi mutex-ul, care îl preia și îl eliberează automat, chiar dacă în interiorul blocului apare o excepție.
Exemplu de utilizare:
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
// Secțiune critică - resursă protejată
counter++
delay(10) // Simulare de lucru
println("Counter: $counter")
} // Mutex-ul este eliberat automat aici
}
fun main() = runBlocking {
repeat(100) {
launch {
incrementCounter()
}
}
delay(1000)
}
În acest exemplu, incrementCounter este o secțiune critică care modifică resursa comună counter. Mutex-ul garantează că doar o corutină are acces la această secțiune la un moment dat, prevenind condițiile de cursă. Utilizarea withLock simplifică gestionarea mutex-ului.