Sobes.tech
Middle+

Jak funguje mutex v korutinách?

sobes.tech AI

Odpověď od AI

Mutex (Mutual Exclusion) v korutinách poskytuje mechanismus vzájemného vyloučení pro ochranu sdílených zdrojů před současným přístupem více korutin.

Princip fungování:

  1. Získání mutexu: Korutina, která chce získat přístup k chráněnému zdroji, volá metodu lock().
  2. Zablokování: Pokud je mutex volný, korutina ho získá bez blokování a pokračuje v provádění. Pokud je mutex obsazen jinou korutinou, volající korutina je pozastavena, dokud mutex nebude uvolněn.
  3. Uvolnění mutexu: Po dokončení práce s chráněným zdrojem korutina volá metodu unlock() k uvolnění mutexu.

Klíčové vlastnosti v korutinách:

  • lock() neblokující (při získání volného mutexu): Na rozdíl od tradičních vláken, kde lock() může blokovat celé vlákno, v korutinách, pokud je mutex volný, je získán bez blokování.
  • Pozastavení korutiny (při obsazeném mutexu): Pokud je mutex obsazen, volající korutina neblokuje vlákno, ale pozastaví se do doby, než bude mutex uvolněn. To umožňuje vlákno vykonávat jiné korutiny.
  • Rozšiřující funkce withLock: Pohodlný způsob použití mutexu, který ho automaticky získá a uvolní, i když dojde k výjimce uvnitř bloku.

Příklad použití:

import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex

val mutex = Mutex()
var counter = 0

suspend fun incrementCounter() {
    mutex.withLock {
        // Kritická sekce - chráněný zdroj
        counter++
        delay(10) // Simulace práce
        println("Counter: $counter")
    } // Mutex je zde automaticky uvolněn
}

fun main() = runBlocking {
    repeat(100) {
        launch {
            incrementCounter()
        }
    }
    delay(1000)
}

V tomto příkladu je incrementCounter kritickou sekcí, která mění sdílený zdroj counter. Mutex zajišťuje, že pouze jedna korutina má přístup k této sekci najednou, čímž se předchází závodním podmínkám. Použití withLock zjednodušuje správu mutexu.