Middle+
Kā darbojas mutex korutīnās?
sobes.tech AI
Atbilde no AI
Mutex korutīnās nodrošina savstarpējas izslēgšanas mehānismu, lai aizsargātu kopīgos resursus no vienlaicīgas piekļuves vairākām korutīnām.
Darba princips:
- Mutex iegūšana: Korutīna, kura vēlas piekļūt aizsargātajam resursam, izsauc metodi
lock(). - Bloķēšana: Ja mutex ir brīvs, korutīna to bez bloķēšanas iegūst un turpina darbu. Ja mutex ir aizņemts ar citu korutīnu, izsaucējošā korutīna tiek pārtraukta līdz mutex tiks atbrīvots.
- Mutex atbrīvošana: Pēc darba ar aizsargāto resursu korutīna izsauc metodi
unlock(), lai atbrīvotu mutex.
Galvenās īpašības korutīnās:
- Ne blokējoša
lock()(ja mutex ir brīvs): Atšķirībā no tradicionālajiem pavedieniem, kurlock()var bloķēt visu pavedienu, korutīnās, ja mutex ir brīvs, tas tiek iegūts bez bloķēšanas. - Korutīnas pārtraukšana (ja mutex ir aizņemts): Ja mutex ir aizņemts, izsaucējošā korutīna neblokē pavedienu, bet pārtraucas līdz mutex tiks atbrīvots. Tas ļauj citām korutīnām darboties.
withLockpaplašinājuma funkcija: Ērts veids, kā izmantot mutex, kas automātiski to iegūst un atbrīvo, pat ja blokā notiek izņēmums.
Piemērs:
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
// Kritiskais sekcija - aizsargāts resurss
counter++
delay(10) // Imitē darbu
println("Counter: $counter")
} // Mutex automātiski atbrīvots šeit
}
fun main() = runBlocking {
repeat(100) {
launch {
incrementCounter()
}
}
delay(1000)
}
Šajā piemērā incrementCounter ir kritiskais sekcija, kas maina kopējo resursu counter. Mutex nodrošina, ka tikai viena korutīna vienlaikus piekļūst šai sekcijai, novēršot sacensību stāvokli. withLock izmantošana atvieglo mutex pārvaldību.