Middle+
Korutinlərdə mutex necə işləyir?
sobes.tech Süni İntellekt
AI-dan cavab
Coroutinlarda mutex (Mutual Exclusion) ümumi resursların eyni vaxtda bir neçə koroutin tərəfindən əldə edilməsinin qarşısını almaq üçün qarşılıqlı istisna mexanizmi təmin edir.
İş prinsipi:
- Mutex-in ələ keçirilməsi: Qoroutine qorunan resursa daxil olmaq istəyirsə,
lock()metodunu çağırır. - Bloklama: Əgər mutex boşdursa, qoroutine onu bloklamadan ələ keçirir və icrasına davam edir. Əgər mutex başqa bir qoroutine tərəfindən tutulursa, çağıran qoroutine mutex sərbəst buraxılana qədər dayandırılır.
- Mutex-in azad edilməsi: İş bitdikdən sonra, qoroutine
unlock()metodunu çağıraraq mutex-i azad edir.
Koroutinlardakı əsas xüsusiyyətlər:
lock()bloklamadan (boş mutex əldə ediləndə): Ənənəvi ipliklərdən fərqli olaraq,lock()bütün ipliyi bloklaya bilər, lakin koroutinlərdə, əgər mutex boşdursa, bloklamadan əldə edilir.- Koroutine-in dayandırılması (mutex tutulduqda): Əgər mutex tutulursa, çağıran qoroutine ipi bloklamır, əksinə dayandırılır və sərbəst buraxılana qədər gözləyir. Bu, ipi digər koroutinlərin icrasına imkan verir.
withLockgenişlənmə funksiyası: Mutex-dən istifadə üçün rahat yol olub, onu avtomatik olaraq ələ keçirir və azad edir, hətta blok daxilində istisna baş verərsə belə.
İstifadə nümunəsi:
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
// Kritik bölmə - qorunan resurs
counter++
delay(10) // İş simulyasiyası
println("Counter: $counter")
} // Mutex burada avtomatik azad edilir
}
fun main() = runBlocking {
repeat(100) {
launch {
incrementCounter()
}
}
delay(1000)
}
Bu nümunədə, incrementCounter kritik bölmədir və ümumi resurs olan counter-ı dəyişdirir. Mutex təmin edir ki, yalnız bir qoroutine eyni zamanda bu bölməyə daxil ola bilər, yarış vəziyyətlərinin qarşısını alır. withLock istifadə mutex idarəsini sadələşdirir.