Sobes.tech
Middle+

Ako funguje mutex v korutinách?

sobes.tech AI

Odpoveď od AI

Mutex (Mutual Exclusion) v korutinách poskytuje mechanizmus vzájomného vylúčenia na ochranu zdieľaných zdrojov pred súčasným prístupom viacerých korutín.

Princíp fungovania:

  1. Získanie mutexu: Korutína, ktorá chce získať prístup k chránenému zdroju, volá metódu lock().
  2. Blokovanie: Ak je mutex voľný, korutína ho získa bez blokovania a pokračuje vo vykonávaní. Ak je mutex obsadený inou korutínou, volajúca korutína je pozastavená, kým mutex nebude uvoľnený.
  3. Uvoľnenie mutexu: Po dokončení práce s chráneným zdrojom korutína volá metódu unlock() na uvoľnenie mutexu.

Kľúčové vlastnosti v korutinách:

  • lock() neblokujúce (pri získaní voľného mutexu): Na rozdiel od tradičných vlákien, kde lock() môže blokovať celé vlákno, v korutinách, ak je mutex voľný, je získaný bez blokovania.
  • Pozastavenie korutiny (keď je mutex obsadený): Ak je mutex obsadený, volajúca korutína neblokuje vlákno, ale sa pozastaví do doby, kým nebude uvoľnený. To umožňuje vlákno vykonávať iné korutiny.
  • Rozšírená funkcia withLock: Pohodlný spôsob používania mutexu, ktorý ho automaticky získa a uvoľní, aj keď v bloku nastane výnimka.

Príklad použitia:

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

val mutex = Mutex()
var counter = 0

suspend fun incrementCounter() {
    mutex.withLock {
        // Kritická sekcia - chránený zdroj
        counter++
        delay(10) // Simulácia práce
        println("Counter: $counter")
    } // Mutex je tu automaticky uvoľnený
}

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

V tomto príklade je incrementCounter kritickou sekciou, ktorá mení zdieľaný zdroj counter. Mutex zabezpečuje, že iba jedna korutina má prístup k tejto sekcii naraz, čím sa predchádza podmienkam súťaže. Použitie withLock zjednodušuje správu mutexu.