Ich habe einen Pentium Core i5-Prozessor, der 4 Kerne hat. Wenn ich dies in einem C#-Konsolenprogramm mache
var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();
ist garantiert, dass T1- und T2-Threads auf separaten Kernen ausgeführt werden?
Antwort1
Sie können in .Net nicht garantieren, dass zwei Thread
s auf zwei separaten Kernen laufen. TatsächlichSie können auch nicht garantieren, dass es Thread
nur auf einem Kern läuft(!).
Das ist weilverwaltete Threads sind nicht dasselbe wie OS-Threads- Ein einzelner verwalteter Thread kann mehrere OS-Threads zur Unterstützung verwenden. In C# arbeiten Sie immer nur direkt mit verwalteten Thread
Threads .(zumindest ohne auf p/invoke zurückzugreifen, um die WinAPI-Threading-Funktionen aufzurufen, was Sie niemals tun sollten).
Die Thread-Scheduler von .Net und Windows sind jedoch sehr gut in dem, was sie tun – sie würden nicht zwei Threads auf einem einzigen Kern ausführen, während ein zweiter Kern völlig untätig ist. Im Allgemeinen müssen Sie sich darüber also keine Sorgen machen.
Antwort2
Nein, das Betriebssystem und die CPU entscheiden, was wann ausgeführt wird. In dem einfachen Beispiel, das Sie gezeigt haben, würden diese (unter Ausschluss anderer Aufgaben) höchstwahrscheinlich parallel auf separaten Kernen ausgeführt werden, aber es gibt selten eine Garantie dafür, dass dies der Fall sein wird.
Du kannst den ... benutzenThread-Affinitätum zu versuchen, eine gewisse Kontrolle über die Zuweisung eines Kerns zu einem bestimmten Thread zu erlangen.
Bedenken Sie auchPlanungsprioritätenum die Karten dahingehend zu stapeln, welche Threads vollständig parallel sein sollten und welche warten können.