Middle+
Корутинада мютекс кандай иштейт?
sobes.tech AI
AIден жооп
Мьютекс (Mutex) корутиндерде жалпы ресурстарды бир убакта бир нече корутиндин кирүүсүнөн коргоо үчүн өз ара исключение механизмин камсыздайт.
Ишке ашыруу принциби:
- Мьютексди кармоо: Кирүүчү корутин
lock()методун чакырат. - Блоктоо: Эгер мьютекс бош болсо, ал блоктогон эмес түрдө алынып, ишин улантат. Эгер мьютекс башка корутинде болсо, чакырган корутин токтоп калат, мынга чейин мьютекс бошотулмайынча.
- Мьютексди бошотуу: Иш аяктагандан кийин, корутин
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 колдонуу мьютекс менен иштөөнү жеңилдетет.