Sobes.tech
Junior — Middle

Come si può integrare il meccanismo Semaphore in un programma esistente per gestire l'accesso alle risorse?

sobes.tech AI

Risposta dell'AI

Il semaforo (semaphore) viene utilizzato per limitare il numero di thread che possono accedere contemporaneamente a una risorsa specifica.

Per integrare un semaforo in un programma esistente su iOS (ad esempio, in Swift), è necessario:

  1. Creare un'istanza di DispatchSemaphore con il numero massimo di permessi (ad esempio, 1 per un mutex).
  2. Prima di accedere alla risorsa, chiamare wait() — se i permessi sono esauriti, il thread aspetterà.
  3. Dopo aver terminato con la risorsa, chiamare signal() per liberare il permesso.

Esempio:

let semaphore = DispatchSemaphore(value: 2) // massimo 2 accessi simultanei

func accessResource() {
    semaphore.wait() // aspetta il permesso
    defer { semaphore.signal() } // garantisce la liberazione

    // Lavoro con la risorsa
    print("Accesso alla risorsa")
    Thread.sleep(forTimeInterval: 1) // simulazione di lavoro
}

// Chiamata da più thread
DispatchQueue.global().async { accessResource() }
DispatchQueue.global().async { accessResource() }
DispatchQueue.global().async { accessResource() }

In questo modo si può controllare l'accesso concorrente ed evitare condizioni di race o sovraccarico della risorsa.