Ho cercato un po', e sembra che non basti usare molto il mutithreading.
Anche perchè il numero di thread da fare dovrebbe essere uguale al numero di core, e questo è un numero che probabilmente aumenterà in futuro. Non conviene riscrivere un algoritmo in due thread e ottimizzarlo, se poi escono i quad core e bisogna rifare il lavoro daccapo.
Inoltre il numero di thread dipende anche da altr fattori, come il carico di lavoro della cpu. Se è in esecuzione solo il nostro programma (probabilmente) il sistema operativo ripartirà i due thread sui due core, ma se il carico di cpu è intenso magari utilizzerà un solo core alternativamente per i due thread, quindi l'overhead del context switch tra i due thread farà in modo che in queste condizioni l'algoritmo diventi meno efficiente di uno single thread...
Invece occorrono delle librerie apposite. Ho trovato questa che sembra la migliore:
OpenMPLa libreria esiste solo per C, C++ e Fortran, tre dei linguaggi a più alte prestazioni esistenti.
Quando ho tempo ci darò un'occhiata.
Questo esempio tratto da wikipedia mi sembra molto esplicativo della potenza della libreria:
#define N 100000
int main(int argc, char *argv[])
{
int i, a[N];
#pragma omp parallel for
for (i=0;i<N;i++)
a[i]= 2*i;
return 0;
}
Questo inizializza un vettore di 100000 interi. Notare che la separazione dell'algoritmo in thread viene fatto dal compilatore, e non c'è un numero di thread prefissato. Quindi si otterrà il massimo delle performance sia su un single core, sia su un dual core o un quad core, indipendentemente dal carico di cpu.