Ho un processore i5 core Pentium, che ha 4 core. Se lo faccio in un programma console C #
var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();
i thread t1 e t2 sono garantiti per funzionare su core separati?
Ho un processore i5 core Pentium, che ha 4 core. Se lo faccio in un programma console C #
var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();
i thread t1 e t2 sono garantiti per funzionare su core separati?
Risposte:
In .Net non è possibile garantire che due Thread
s vengano eseguiti su due core separati. In effetti, non puoi nemmeno garantire che uno Thread
funzionerà solo su un core (!) .
Questo perché i thread gestiti non sono gli stessi dei thread del sistema operativo : un singolo thread gestito può utilizzare più thread del sistema operativo per supportarlo. In C #, hai sempre a che fare direttamente con i gestiti Thread
s (almeno, senza ricorrere a p / invoke per chiamare le funzioni di threading WinAPI, cosa che non dovresti mai fare) .
Tuttavia, i programmatori di thread .Net e Windows sono molto bravi in quello che fanno: non eseguono due thread su un singolo core mentre un secondo core rimane completamente inattivo. Quindi, in generale, non devi preoccuparti.
Thread
s sono discussioni OS. Ma non è per questo che non vi è alcuna garanzia che un singolo thread verrà sempre eseguito sullo stesso core.
async
parola chiave (che è ciò di cui presumo tu stia parlando, in quanto "thread asincroni" è ridondante) è solo zucchero sintattico per l'utilizzo di un BackgroundWorker
thread, che è come qualsiasi altro thread .Net - non puoi garantire se verrà eseguito su un nucleo separato o no.
No, il sistema operativo e la CPU decideranno cosa eseguire e quando. nell'esempio semplice che hai mostrato, ad esclusione di altre attività, sì, quelle verrebbero probabilmente eseguite in parallelo su core separati, ma raramente c'è la garanzia che ciò accada.
È possibile utilizzare l' affinità del thread per tentare di assumere un certo controllo sull'allocazione di un core a un determinato thread.
Considera anche le priorità di pianificazione per impilare il mazzo in termini di quali thread dovrebbero essere completamente paralleli e quali possono attendere.
t1
et2
viene eseguito in momenti diversi in un ordine arbitrario (ad esempio, è possibilet2
iniziare primat1
in alcuni modelli).