Middle+
Ako funguje mutex v korutinách?
sobes.tech AI
Odpoveď od AI
Mutex (Mutual Exclusion) v korutinách poskytuje mechanizmus vzájomného vylúčenia na ochranu zdieľaných zdrojov pred súčasným prístupom viacerých korutín.
Princíp fungovania:
- Získanie mutexu: Korutína, ktorá chce získať prístup k chránenému zdroju, volá metódu
lock(). - Blokovanie: Ak je mutex voľný, korutína ho získa bez blokovania a pokračuje vo vykonávaní. Ak je mutex obsadený inou korutínou, volajúca korutína je pozastavená, kým mutex nebude uvoľnený.
- Uvoľnenie mutexu: Po dokončení práce s chráneným zdrojom korutína volá metódu
unlock()na uvoľnenie mutexu.
Kľúčové vlastnosti v korutinách:
lock()neblokujúce (pri získaní voľného mutexu): Na rozdiel od tradičných vlákien, kdelock()môže blokovať celé vlákno, v korutinách, ak je mutex voľný, je získaný bez blokovania.- Pozastavenie korutiny (keď je mutex obsadený): Ak je mutex obsadený, volajúca korutína neblokuje vlákno, ale sa pozastaví do doby, kým nebude uvoľnený. To umožňuje vlákno vykonávať iné korutiny.
- Rozšírená funkcia
withLock: Pohodlný spôsob používania mutexu, ktorý ho automaticky získa a uvoľní, aj keď v bloku nastane výnimka.
Príklad použitia:
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
// Kritická sekcia - chránený zdroj
counter++
delay(10) // Simulácia práce
println("Counter: $counter")
} // Mutex je tu automaticky uvoľnený
}
fun main() = runBlocking {
repeat(100) {
launch {
incrementCounter()
}
}
delay(1000)
}
V tomto príklade je incrementCounter kritickou sekciou, ktorá mení zdieľaný zdroj counter. Mutex zabezpečuje, že iba jedna korutina má prístup k tejto sekcii naraz, čím sa predchádza podmienkam súťaže. Použitie withLock zjednodušuje správu mutexu.