Sobes.tech
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:

  1. Mutex-in ələ keçirilməsi: Qoroutine qorunan resursa daxil olmaq istəyirsə, lock() metodunu çağırır.
  2. 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.
  3. 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.
  • withLock geniş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.