· Andrea Pollini · materiale didattico · 3 min read
esercizi gestione della sincronizzazione
Esercizi sulla gestione della sincronizzazione per i thread
Esercizi sulla sincronizzazione
La sincronizzazione è una parte importante della programmazione concorrente in Python. In questa sezione troverai 20 esercizi sulla sincronizzazione, divisi in tre livelli di difficoltà crescente.
Livello 1: Basics
- Conta fino a 10: Crea due thread che stampano i numeri da 1 a 10. Utilizza il modulo
threading
per creare e avviare i thread. - Somma di numeri: Crea due thread che sommano i numeri da 1 a 100. Utilizza il modulo
threading
per creare e avviare i thread, e utilizza una variabile condivisa per memorizzare il risultato finale. - Timer: Crea un thread che stampa l’ora corrente ogni secondo. Utilizza il modulo
threading
e la funzionetime.sleep()
per implementare il timer.
Livello 2: Locks
- Conteggio condiviso: Crea due thread che incrementano una variabile condivisa. Utilizza un lock per evitare race conditions.
- Accesso condiviso a una risorsa: Crea due thread che accedono a una risorsa condivisa (ad esempio, un file). Utilizza un lock per garantire l’accesso esclusivo alla risorsa.
- Protezione di una lista condivisa: Crea una lista condivisa e due thread che aggiungono elementi alla lista. Utilizza un lock per proteggere la lista dalle modifiche simultanee.
Livello 3: Condizioni e eventi
- Produttore/consumatore: Crea due thread, uno che produce numeri e l’altro che li consuma. Utilizza una coda condivisa e le condizioni per sincronizzare i thread.
- Barriera di sincronizzazione: Crea tre thread che stampano un messaggio in ordine sequenziale. Utilizza una barriera di sincronizzazione per garantire che i thread stampino il messaggio nella giusta sequenza.
- Eventi di terminazione: Crea due thread e utilizza gli eventi per gestire la loro terminazione. Il primo thread deve attendere che il secondo termini prima di terminare a sua volta.
Livello 4: Sincronizzazione avanzata
- Semafori: Crea tre thread che accedono a una risorsa condivisa. Utilizza i semafori per controllare l’accesso alla risorsa e prevenire race conditions.
- Lock con timeout: Modifica l’esercizio 4 del livello 2 in modo da utilizzare un lock con timeout per evitare deadlocks.
- Thread pool: Crea una pool di thread e utilizza le condizioni per gestire i task in ingresso e in uscita dalla pool.
Livello 5: Mix
- Produttore/consumatore con semafori: Modifica l’esercizio 1 del livello 4 in modo da utilizzare i semafori invece delle condizioni per sincronizzare i thread.
- Barriera di sincronizzazione con eventi: Modifica l’esercizio 3 del livello 3 in modo da utilizzare le barriere di sincronizzazione invece degli eventi per gestire la terminazione dei thread.
- Lock condiviso tra processi: Crea due processi che accedono a una risorsa condivisa. Utilizza un lock condiviso tra i processi per garantire l’accesso esclusivo alla risosa.
- Sincronizzazione con file di lock: Crea due thread che scrivono su un file condiviso. Utilizza un file di lock per sincronizzare l’accesso al file e prevenire race conditions.
- Sincronizzazione con pipe: Crea due processi che comunicano attraverso una pipe. Utilizza le pipe per sincronizzare i processi e scambiare dati tra di loro.