Se avete un processore quad-core, potete avere quattro threads hardware, o otto threads hardware se il vostro processore è iper-threaded. Ciò significa che si possono potenzialmente avere otto thread che eseguono in parallelo, o allo stesso tempo.
Ora, ci si potrebbe chiedere: se questo è vero, come faccio a generare centinaia di thread nel mio codice C++? Beh, questa è solo un'illusione. Certo, avete 100 thread, ma questo non significa che stiano lavorando allo stesso tempo. Significa solo che sono lì, e sta allo scheduler determinare come eseguire questi thread e per quanto tempo eseguire ogni thread (determinato da quanto della CPU e quanto I/O usa ciascuno, tra gli altri fattori). Questi sono chiamati thread a livello di kernel: il kernel li "vede" e sa che esistono.
Ora c'è una linea davvero sfocata tra "thread software" e "thread hardware". Non sono due concetti, sono la stessa cosa - solo thread. Tenete a mente che se avete un processore che supporta, diciamo, otto thread, allora generare otto thread non significa che verranno eseguiti insieme su tutti gli otto core. Lo scheduler potrebbe scegliere di eseguirli tutti su due soli core, ma avrete comunque otto thread.