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 улеснява управлението на мютекса.