Middle+
Koritinalarda mutex qanday ishlaydi?
sobes.tech AI
AIdan javob
Mutex (Mutual Exclusion) coroutinlarda umumiy resurslarni bir vaqtning o'zida bir nechta koroutinlar tomonidan kirishdan himoya qilish uchun o'zaro chiqarish mexanizmini ta'minlaydi.
Ishlash prinsipi:
- Mutexni ushlash: Himoyalangan resursga kirishni istagan koroutine
lock()metodini chaqiradi. - Bloklash: Agar mutex bo'sh bo'lsa, koroutine uni bloklamasdan ushlaydi va bajarishni davom ettiradi. Agar mutex boshqa koroutine tomonidan band bo'lsa, chaqiruvchi koroutine to'xtatiladi va mutex bo'shatilgunga qadar kutadi.
- Mutexni bo'shatish: Himoyalangan resurs bilan ish tugagach, koroutine
unlock()metodini chaqiradi va mutexni bo'shatadi.
Koroutinlardagi asosiy xususiyatlar:
lock()bloklamasdan (bo'sh mutexni ushlashda): An'anaviy iplar bilan solishtirganda,lock()butun ipni bloklashi mumkin, lekin koroutinlarda, agar mutex bo'sh bo'lsa, u bloklamasdan ushlanadi.- Koroutineni to'xtatish (mutex band bo'lsa): Agar mutex band bo'lsa, chaqiruvchi koroutine ipni bloklamaydi, balki to'xtatiladi va bo'shatilgunga qadar kutadi. Bu ipni boshqa koroutinlarni bajarish uchun bo'sh qiladi.
withLockkengaytma funksiyasi: Mutexdan foydalanishning qulay usuli bo'lib, u uni avtomatik ravishda ushlaydi va bo'shatadi, hatto blok ichida istisno yuzaga kelsa ham.
Foydalanish misoli:
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
// Kritik bo'lim - himoyalangan resurs
counter++
delay(10) // Ishni taqlid qilish
println("Counter: $counter")
} // Mutex avtomatik ravishda bu yerda bo'shatiladi
}
fun main() = runBlocking {
repeat(100) {
launch {
incrementCounter()
}
}
delay(1000)
}
Ushbu misolda, incrementCounter - umumiy resurs counter ni o'zgartiradigan kritik bo'lim. Mutex faqat bitta koroutinega bu bo'limga kirishga ruxsat beradi, shuning uchun raqobat shartlari oldini oladi. withLock mutexni boshqarishni soddalashtiradi.