Quando avvii più thread su un processore multi core, è garantito che vengano elaborati da core diversi?


24

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?


1
Supponendo che il runtime C # utilizzi chiamate di sistema native equivalenti per generare un altro thread (ed è quindi veramente parallelo; questo non è il caso di tutto, come il famigerato Global Interpreter Lock di CPython ), ciò dipenderebbe esclusivamente dal programmatore di processi / attività del sistema operativo . In generale, tuttavia, il codice è veramente sicuro per i thread se lo si assume t1e t2viene eseguito in momenti diversi in un ordine arbitrario (ad esempio, è possibile t2iniziare prima t1 in alcuni modelli).
Breakthrough

2
Non sapevo che esistessero processori Pentium i5. Forse intendevi Core i5? Schizzinosi. Lo so: D
Joseph Garrone l'

Risposte:


18

In .Net non è possibile garantire che due Threads vengano eseguiti su due core separati. In effetti, non puoi nemmeno garantire che uno Threadfunzionerà 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 Threads (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.


In pratica, Net Threads sono discussioni OS. Ma non è per questo che non vi è alcuna garanzia che un singolo thread verrà sempre eseguito sullo stesso core.
svick,

2
@svick: In pratica, su x86 , è vero. Tuttavia, lo standard afferma esplicitamente che non è possibile fare affidamento su questo comportamento, quindi potrebbe cambiare in futuro. In realtà, è non è vero su altre versioni del .NET CLR, come Xbox 360.
BlueRaja - Danny Pflughoeft l'

@BlueRaja - La domanda è specifica su quale versione del CLR stiamo parlando. Puoi garantire l'esistenza di qualcosa su due core separati usando i thread asincroni perché ciò significherebbe che si verificherebbero asincroni l'uno dall'altro. Il codice di esempio corrente è tecnicamente una chiamata di sincronizzazione. Ovviamente il sistema operativo decide quali core verranno utilizzati.
Ramhound,

@Ramhound "Puoi garantire l'esistenza di qualcosa su due core separati usando thread asincroni" - è falso. La asyncparola chiave (che è ciò di cui presumo tu stia parlando, in quanto "thread asincroni" è ridondante) è solo zucchero sintattico per l'utilizzo di un BackgroundWorkerthread, che è come qualsiasi altro thread .Net - non puoi garantire se verrà eseguito su un nucleo separato o no.
BlueRaja - Danny Pflughoeft il

@BlueRaja - Se fossero avviati due thread asincroni, entrambi verrebbero eseguiti contemporaneamente a condizione che fossero presenti 2 core della CPU. Se ce n'era solo uno, il sistema operativo avrebbe programmato quando ogni thread avrebbe avuto la priorità e l'esecuzione e si sarebbe verificata la tipica situazione di thrashing a thread singolo. È stato così che mi è stato insegnato come una CPU gestisce multi-thread.
Ramhound,

15

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.


1
Voglio anche aggiungere che tra le tecnologie di virtualizzazione esiste un altro livello tra il tuo programma e l'hardware. Ciò che il sistema operativo presenta all'applicazione potrebbe non essere fisicamente accurato.
Keltari,

1
Quelle sono funzioni WinAPI per thread del sistema operativo, non per thread gestiti. Non dovrebbero mai essere chiamati da C #, poiché potrebbero interferire gravemente con lo scheduler di thread .Net.
BlueRaja - Danny Pflughoeft
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.