Wenn Sie mehrere Threads auf einem Mehrkernprozessor starten, ist dann garantiert, dass sie von unterschiedlichen Kernen verarbeitet werden?

Wenn Sie mehrere Threads auf einem Mehrkernprozessor starten, ist dann garantiert, dass sie von unterschiedlichen Kernen verarbeitet werden?

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 Threads auf zwei separaten Kernen laufen. TatsächlichSie können auch nicht garantieren, dass es Threadnur 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 ThreadThreads .(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.

verwandte Informationen