Quando usare multitasking

Esistono due modi per implementare il multitasking: come singolo processo con più thread o come più processi, ognuno con uno o più thread. Un'applicazione può inserire ogni thread che richiede uno spazio indirizzi privato e risorse private nel proprio processo, per proteggerlo dalle attività di altri thread di processo.

Un processo multithreading può gestire attività che si escludono a vicenda con thread, ad esempio fornendo un'interfaccia utente ed eseguendo calcoli in background. La creazione di un processo multithreading può anche essere un modo pratico per strutturare un programma che esegue più attività simili o identiche contemporaneamente. Ad esempio, un server named pipe può creare un thread per ogni processo client collegato alla pipe. Questo thread gestisce la comunicazione tra il server e il client. Il processo può usare più thread per eseguire le attività seguenti:

  • Gestire l'input per più finestre.
  • Gestire l'input da diversi dispositivi di comunicazione.
  • Operare una distinzione tra attività con diversa priorità. Un thread ad alta priorità, ad esempio, gestisce attività in cui il tempo riveste molta importanza mentre un'attività a bassa priorità ne esegue altre.
  • Consentire all'interfaccia utente di continuare ad essere veloce, allocando più tempo alle attività in background.

È in genere più efficiente per un'applicazione implementare il multitasking creando un singolo processo multithreading, anziché creare più processi, per i motivi seguenti:

  • Il sistema può eseguire un cambio di contesto più rapidamente per i thread rispetto ai processi, perché un processo ha un sovraccarico maggiore rispetto a un thread (il contesto del processo è più grande del contesto del thread).
  • Tutti i thread di un processo condividono lo stesso spazio indirizzi e possono accedere alle variabili globali del processo, semplificando così la comunicazione tra thread.
  • Tutti i thread di un processo possono condividere handle aperti alle risorse, ad esempio file e pipe.

Esistono altre tecniche che è possibile usare al posto del multithreading. Di seguito sono riportati i più significativi: input asincrono e output (I/O), porte di completamento di I/O, chiamate asincrone di routine (APC) e possibilità di attendere più eventi.

Un singolo thread può avviare più richieste di I/O che richiedono molto tempo che possono essere eseguite contemporaneamente usando operazioni di I/O asincrone. Le operazioni di I/O asincrone possono essere eseguite su file, pipe e dispositivi di comunicazione seriale. Per altre informazioni, vedere Sincronizzazione e input e output sovrapposti.

Un singolo thread può bloccare la propria esecuzione durante l'attesa di uno o tutti gli eventi. Ciò è più efficiente rispetto all'uso di più thread, ognuno in attesa di un singolo evento e più efficiente rispetto all'uso di un singolo thread che utilizza il tempo del processore controllando continuamente la presenza di eventi. Per altre informazioni, vedere Funzioni di attesa.