La regola empirica per i thread è, si vuole almeno un thread di lavoro "attivo" (in grado di avere i suoi comandi eseguiti immediatamente dato CPU) per ogni "unità di esecuzione" disponibile sul computer. Una "unità di esecuzione" è un processore di istruzioni logiche, quindi un server iperthreaded Xeon quad-core e quad-core avrebbe 32 EU (4 chip, 4 core per chip, ciascuno hyperthreaded). Il tuo Core i7 medio avrebbe 8.
Un thread per UE è l'uso più completo della potenza della CPU, a condizione che i thread siano sempre in esecuzione; questo non è quasi mai il caso, poiché i thread devono accedere alla memoria non memorizzata nella cache, al disco rigido, alle porte di rete, ecc. che devono attendere e che non richiedono l'attenzione attiva della CPU. In questo modo è possibile aumentare ulteriormente l'efficienza generale con più thread in coda e molto rari. Questo ha un costo; quando una CPU cambia un thread, deve memorizzare nella cache i registri del thread, il puntatore di esecuzione e altre informazioni di stato normalmente conservate nei meccanismi interni di un'UE e molto rapidamente accessibili, consentendo ad altre EU in quel chip CPU di raccoglierlo. Richiede inoltre thread nel sistema operativo per decidere su quale thread deve essere attivato. Infine, quando una UE cambia argomento, perde i guadagni in termini di prestazioni del pipelining utilizzato dalla maggior parte delle architetture dei processori; deve lavare la pipeline prima di passare ai fili. Tuttavia, poiché tutto ciò richiede in media molto meno tempo del semplice attesa del disco rigido o persino della RAM per tornare indietro con le informazioni, ne vale la pena.
Tuttavia, in generale, una volta superato il doppio del numero di thread "attivi" come UE, il sistema operativo inizia a spendere più thread di pianificazione temporale dell'UE, e gli EU passano più tempo a passare da loro, rispetto a quelli effettivamente spesi esecuzione di thread attivi di programmi. Questo è il punto delle diseconomie di scala; a questo punto sarà necessario più tempo per l'esecuzione di un algoritmo multithread se si aggiungesse un thread aggiuntivo.
Quindi, nel complesso, si desidera mantenere almeno il numero di thread nel proprio programma rispetto a quelli dell'UE sul computer, ma si desidera evitare di avere più del doppio di quel numero che non è in attesa o in attesa.