2014-12-19 5 views
5

ich auf einer 8-CPU-Maschine eine Single-Threaded-Anwendung entwickle und wenn eine schwere Operation der CPU-Auslastung geschieht scheint wie folgt aus:Hat ein Single-Threaded-Anwendung laufen auf nur einer CPU

enter image description here

das tut. NET-Framework haben eine Möglichkeit, die Arbeit dieses einzelnen Thread (automatisch) in die anderen CPUs zu teilen?

+0

Welche Art von Anwendung ist das? Konsole, WPF, WinForms ...? –

+0

Sie wissen, dass CPUs und Kerne anders sind, oder? Ich schätze, Sie haben 1 CPU mit 8 Kernen oder 2 CPUs mit 4 Kernen und nicht 8 CPUs. – deathismyfriend

+0

@ThomasLevesque, Ist das wichtig? – mhs

Antwort

1

.NET Garbage Collector auf einem anderen Thread ausgeführt wird, das GUI, wenn Sie tun WinForms/WPF, und das Betriebssystem werden alle Arten von Arbeit in anderen Threads tun schneller Ihre Single-Thread-App laufen zu helfen.

1

Eine Single-Thread-Anwendung läuft nur auf einem Kern Ihrer CPU, so wie es funktioniert, wenn Sie mehrere CPUs haben, bekommen Sie nur mehr Kerne, die Ihren PC leistungsfähiger machen. Sie verwenden nur einen Kern auf allen CPUs.

-3

Nein, es wird immer in einem Prozessor/Kern ausgeführt, und es kann sich abhängig vom Scheduler ändern.

Sie können auch async and await verwenden, und sie werden mit der Fluidität Ihrer Anwendung helfen.

Haben Sie in Task sah, seine eine sehr einfache Art und Weise Fäden zu schaffen

Task.Run(() => 
{ 
    // Do something that will take a long time 
    Thread.Sleep(10000); 
}); 
+2

Dies ist völlig neben dem Punkt ; Das ist überhaupt nicht das, was das OP gefragt hat. –

+1

Ich liebe es, wenn Leute etwas abstimmen, was wirklich hilft, obwohl es keine vollständige Antwort ist, erklären die anderen Antworten bisher einfach, was das erwartete Verhalten ist (Aber nicht abgestimmt), und beantwortet überhaupt nicht die 2 obigen Fragen. – Oakcool

+5

Das OP fragt, ob eine Singlethread-App auf einer einzelnen CPU ausgeführt wird. Ihre Antwort zeigt, wie Sie eine Operation in einem anderen Thread ausführen. Ich sehe nicht, wie dies die Frage des OP beantwortet ... –

2

Auch ein Verfahren mit nur einem Thread kann, kann immer noch nicht, dass ein Thread auf der gleichen CPU laufen. Die Gesamt CPU-Auslastung für diesen Prozess kann natürlich 100% eines einzelnen Kerns nicht überschreiten. Aber diese 100% können sich auf so viele Kerne verteilen, wie sie auf der Maschine vorhanden sind. So können Sie z.B. 50% Auslastung auf zwei verschiedenen Kernen statt 100% auf nur einem, 25% auf vier verschiedenen Kernen usw.

6

Es wird nicht garantiert, dass ein einzelner Thread immer auf demselben Kern ausgeführt wird. Aber es ist garantiert, dass es nur auf einem Kern zur gleichen Zeit läuft. Aber es kann auf einem Kern bis zum Kontextwechsel ausgeführt werden und nach dem Kontextwechsel auf einem anderen Kern fortgesetzt werden. Jede Zeitscheibe, die Ihr Thread bekommt, kann auf einem anderen Kern zugewiesen werden.

5

Kann eine Anwendung mit nur einem Thread auf nur einer CPU ausgeführt werden?

Wie andere festgestellt haben, nicht unbedingt. Ein bestimmter Thread wird jedoch nur auf einem Kern zu einer Zeit ausgeführt.

Hat .net-Framework eine Möglichkeit, die Arbeit in die anderen CPUs zu teilen?

Ja. .NET hat die Parallel class and Parallel LINQ. Beachten Sie, dass Sie die Arbeit selbst aufteilen müssen (in kleine Teile), und dann wird das .NET Framework die Arbeit zwischen mehreren Threads automatisch abgleichen.

-1

Ich weiß, dass dies ein alter Thread ist, aber ich kam hier mit dem gleichen Problem, und eine andere Ursache/Lösung.

Wenn Sie Ihr Programm über den Visual Studio Debugger (hier VS2012) starten, scheint es, dass Ihre Threads an einen einzelnen Kern gebunden sind. Um alle verfügbaren Kerne zu verwenden, musste ich es direkt von der ausführbaren Datei oder von einer Windows-Befehlszeile starten.

Kann sehr spezifisch sein, aber hoffe es hilft.

Verwandte Themen