Sobes.tech
Middle+

Come funziona un mutex nelle coroutine?

sobes.tech AI

Risposta dell'AI

Il mutex (Mutual Exclusion) nelle coroutine fornisce un meccanismo di esclusione mutua per proteggere risorse condivise da accessi simultanei da parte di più coroutine.

Principio di funzionamento:

  1. Acquisizione del mutex: La coroutine che desidera accedere alla risorsa protetta chiama il metodo lock().
  2. Blocco: Se il mutex è libero, la coroutine lo acquisisce senza bloccare e continua l'esecuzione. Se il mutex è occupato da un'altra coroutine, la coroutine chiamante viene sospesa fino a quando il mutex non viene rilasciato.
  3. Rilascio del mutex: Dopo aver terminato il lavoro con la risorsa protetta, la coroutine chiama il metodo unlock() per rilasciare il mutex.

Caratteristiche chiave nelle coroutine:

  • lock() non bloccante (quando si acquisisce un mutex libero): A differenza dei thread tradizionali, dove lock() può bloccare l'intero thread, nelle coroutine, se il mutex è libero, l'acquisizione avviene senza blocco.
  • Sospensione della coroutine (quando il mutex è occupato): Se il mutex è occupato, la coroutine chiamante non blocca il thread, ma si sospende fino a quando non viene rilasciato. Questo libera il thread per eseguire altre coroutine.
  • Funzione di estensione withLock: Modo comodo di usare il mutex, che lo acquisisce e rilascia automaticamente, anche se si verifica un'eccezione all'interno del blocco.

Esempio di utilizzo:

import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex

val mutex = Mutex()
var counter = 0

suspend fun incrementCounter() {
    mutex.withLock {
        // Sezione critica - risorsa protetta
        counter++
        delay(10) // Simulazione di lavoro
        println("Counter: $counter")
    } // Il mutex viene rilasciato automaticamente qui
}

fun main() = runBlocking {
    repeat(100) {
        launch {
            incrementCounter()
        }
    }
    delay(1000)
}

In questo esempio, incrementCounter è una sezione critica che modifica la risorsa condivisa counter. Il mutex garantisce che solo una coroutine alla volta abbia accesso a questa sezione, prevenendo condizioni di gara. L'uso di withLock semplifica la gestione del mutex.