Middle+
Kako funkcioniše mutex u korutinama?
sobes.tech АИ
Одговор од АИ
Мьютекс (Mutual Exclusion) у корутинама пружа механизам за међусобно искључење заштите заједничких ресурса од истовременог приступа од стране више корутин.
Принцип рада:
- Завладевање мјутекса: Корутинa која жели да приступи заштићеном ресурсу позива метод
lock(). - Блокирање: Ако је мјутекс слободан, она га преузима без блокирања и наставља са извршавањем. Ако је заузет од стране друге корутине, позивајућа корутина се суспендује док мјутекс не буде ослобођен.
- Освјобођивање мјутекса: Након завршетка рада са заштићеним ресурсом, корутина позива метод
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 поједностављује управљање мјутексом.