Sobes.tech
Middle+

Корутинада мютекс кандай иштейт?

sobes.tech AI

AIден жооп

Мьютекс (Mutex) корутиндерде жалпы ресурстарды бир убакта бир нече корутиндин кирүүсүнөн коргоо үчүн өз ара исключение механизмин камсыздайт.

Ишке ашыруу принциби:

  1. Мьютексди кармоо: Кирүүчү корутин lock() методун чакырат.
  2. Блоктоо: Эгер мьютекс бош болсо, ал блоктогон эмес түрдө алынып, ишин улантат. Эгер мьютекс башка корутинде болсо, чакырган корутин токтоп калат, мынга чейин мьютекс бошотулмайынча.
  3. Мьютексди бошотуу: Иш аяктагандан кийин, корутин unlock() методун чакырып, мьютексди бошотот.

Корутиндердеги негизги өзгөчөлүктөр:

  • Блоктогон эмес lock() (бос мьютекс кармалганда): Традициялык агымдардан айырмаланып, мында lock() бүт агымды блоктогон эмес, эгер мьютекс бош болсо, ал автоматтык түрдө алынып, ишке ашырылат.
  • Корутиндин токтотулушу (бош мьютекс): Эгер мьютекс бош эмес болсо, чакырган корутин агымды блоктогон эмес, токтотулат жана мьютекс бошотулгуча күтөт. Бул башка корутиндер үчүн агымды бошотот.
  • 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 колдонуу мьютекс менен иштөөнү жеңилдетет.