Middle+
Jak funguje mutex v korutinách?
sobes.tech AI
Odpověď od AI
Mutex (Mutual Exclusion) v korutinách poskytuje mechanismus vzájemného vyloučení pro ochranu sdílených zdrojů před současným přístupem více korutin.
Princip fungování:
- Získání mutexu: Korutina, která chce získat přístup k chráněnému zdroji, volá metodu
lock(). - Zablokování: Pokud je mutex volný, korutina ho získá bez blokování a pokračuje v provádění. Pokud je mutex obsazen jinou korutinou, volající korutina je pozastavena, dokud mutex nebude uvolněn.
- Uvolnění mutexu: Po dokončení práce s chráněným zdrojem korutina volá metodu
unlock()k uvolnění mutexu.
Klíčové vlastnosti v korutinách:
lock()neblokující (při získání volného mutexu): Na rozdíl od tradičních vláken, kdelock()může blokovat celé vlákno, v korutinách, pokud je mutex volný, je získán bez blokování.- Pozastavení korutiny (při obsazeném mutexu): Pokud je mutex obsazen, volající korutina neblokuje vlákno, ale pozastaví se do doby, než bude mutex uvolněn. To umožňuje vlákno vykonávat jiné korutiny.
- Rozšiřující funkce
withLock: Pohodlný způsob použití mutexu, který ho automaticky získá a uvolní, i když dojde k výjimce uvnitř bloku.
Příklad použití:
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
// Kritická sekce - chráněný zdroj
counter++
delay(10) // Simulace práce
println("Counter: $counter")
} // Mutex je zde automaticky uvolněn
}
fun main() = runBlocking {
repeat(100) {
launch {
incrementCounter()
}
}
delay(1000)
}
V tomto příkladu je incrementCounter kritickou sekcí, která mění sdílený zdroj counter. Mutex zajišťuje, že pouze jedna korutina má přístup k této sekci najednou, čímž se předchází závodním podmínkám. Použití withLock zjednodušuje správu mutexu.