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

  1. Mutex iegūšana: Korutīna, kura vēlas piekļūt aizsargātajam resursam, izsauc metodi lock().
  2. 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.
  3. 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, kur lock() 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.
  • withLock paplaš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.