La programmazione Multithreading
La programmazione multithreading è un paradigma di sviluppo che permette di eseguire più sottoprocessi in parallelo. E' anche detta programmazione concorrente.
Cos'è un thread? Un thread è un sottoprocesso lanciato da un processo principale. L'esecuzione del thread è indipendente dal processo che "padre" l'ha lanciato.
In un programma ci sono diverse operazioni indipendenti che potrebbero essere eseguite contemporaneamente, ossia in parallelo.
Queste operazioni possono essere gestite con più efficienza in multithreading.
Come funziona il multithread
Un programma tradizionale esegue le operazioni o task in sequenza, dall'inizio alla fine.
L'elaborazione avviene in un unico processo.
Pertanto, viene eseguito un task alla volta ( batch mode ).
Gli altri restano in coda di attesa.
Per ridurre i tempi di esecuzione posso usare il multithread.
Il programma principale esegue contemporaneamente alcuni task come sottoprocessi ( thread ).
In questo modo, possono essere eseguiti dal processore senza attendere la coda di attesa del programma.
Esempio. Nell'esempio precedente il tempo di esecuzione del programma in multithreading è T1. Se il programma eseguisse i task in sequenza il tempo di esecuzione sarebbe T2. Circa quattro volte superiore.
A cosa serve il multithreading
Il tempo di esecuzione e la complessità temporale del programma si riduce.
In pratica, il programma termina l'elaborazione dati in minore tempo.
Nota. Ovviamente, le operazione gestite con i thread devono essere indipendenti dalle altre. In caso contrario, se ci fosse una qualche dipendenza, è opportuno programmare anche un sistema di sincronizzazione dei thread.
Pro e contro della programmazione multithreading
Uno dei punti di forza della programmazione multithreading è la complessità temporale.
Vanno però considerati anche alcuni handicap.
In particolar modo, l'esecuzione di un programma in multithreading è più complessa da controllare o monitorare, perché i sottoprocessi (thread) sono eseguiti in background rispetto al processo "padre".
In caso di errore o malfunzionamento di un sottoprocesso è più difficile accorgersene.