La prescrizione sul numero di thread non ha nulla a che fare con la logica della tua applicazione. Potrebbe avere senso avere MOLTI thread in più rispetto ai nuclei dell'applicazione, indipendentemente dal fatto che siano vincolati all'elaborazione o al limite I / O.
Il motivo della prescrizione è che quando si hanno più thread legati all'elaborazione rispetto ai core, i thread aggiuntivi di calcolo extra sono in attesa e non stanno facendo progressi in avanti sul loro calcolo.
Considera di avere T = 20 thread e C = 8 core. Considera il tuo run-q (l'elenco dei thread disponibili da eseguire). Al massimo 8 possono essere in esecuzione, e il resto sarà seduto in coda in attesa della possibilità di correre.
Se una grande percentuale dei tuoi thread fosse vincolata all'I / O (o bloccasse realmente qualcosa), allora non sarebbero comunque "pronti per essere eseguiti" e non influenzeranno l'utilizzo della CPU.
Se pensi che il lavoro della tua applicazione sia quello di mantenere tutti i core della CPU (completamente funzionanti al 100%), non c'è alcun guadagno nell'utilizzo della CPU aggiungendo più thread ad alta intensità di calcolo dopo averne avuto abbastanza (compute intensive ) thread per ogni core (logico).
NOTA: questo è il processo mentale dietro questa teoria (e probabilmente il blogger). Non è proprio vero. Ci sono MOLTI altri fattori che vengono presi in considerazione nel decidere come ottenere il massimo dal tuo processore. Una considerazione è che rallenta ogni core per far funzionare tutti i core. Così ANCORA fino al punto in cui hai abbastanza thread di calcolo per ogni core, l'aggiunta di più thread di calcolo può rallentarti tanto quanto velocizzarti.
E c'è un sovraccarico significativo della CPU nella gestione dei thread (e possono essere problemi di localizzazione della memoria, a seconda di come allocare / gestire i thread).
UN CONSIGLIO / SOMMARIO
Quindi - personalmente - consiglierei di preoccuparmi meno di questo tipo di ragionamento, e di più sulla struttura logica della tua applicazione - che cosa ha senso e come farlo funzionare. Utilizzare i pool di thread. E rendi le loro dimensioni configurabili.
My $ 0.02.