Sobes.tech
Middle+

Kako funkcioniše mutex u korutinama?

sobes.tech АИ

Одговор од АИ

Мьютекс (Mutual Exclusion) у корутинама пружа механизам за међусобно искључење заштите заједничких ресурса од истовременог приступа од стране више корутин.

Принцип рада:

  1. Завладевање мјутекса: Корутинa која жели да приступи заштићеном ресурсу позива метод lock().
  2. Блокирање: Ако је мјутекс слободан, она га преузима без блокирања и наставља са извршавањем. Ако је заузет од стране друге корутине, позивајућа корутина се суспендује док мјутекс не буде ослобођен.
  3. Освјобођивање мјутекса: Након завршетка рада са заштићеним ресурсом, корутина позива метод unlock() да би ослободила мјутекс.

Кључне карактеристике у корутинaма:

  • lock() не блокирајуће (при узимању слободног мјутекса): За разлику од традиционалних нити, гдје lock() може блокирати цијелу нит, у корутинaма, ако је мјутекс слободан, узимање се одвија без блокирања.
  • Суспендовање корутине (када је мјутекс заузет): Ако је мјутекс заузет, позивајућа корутина не блокира нит, већ се суспендује до његовог ослобађања. Ово ослобађа нит за извршавање других корутин.
  • Функција за проширење withLock: Удобан начин коришћења мјутекса, који га аутоматски узима и ослобађа, чак и ако унутар блока дође до изузетка.

Пример употребе:

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

val mutex = Mutex()
var counter = 0

suspend fun incrementCounter() {
    mutex.withLock {
        // Критична секција - заштићени ресурс
        counter++
        delay(10) // Имитација рада
        println("Counter: $counter")
    } // Мјутекс се аутоматски ослобађа овде
}

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

У овом примеру, incrementCounter је критична секција која мења заједнички ресурс counter. Мјутекс гарантује да само једна корутина у исто време има приступ овој секцији, спречавајући услове трка. Употреба withLock поједностављује управљање мјутексом.