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