Beeinträchtigt Thread.Sleep andere Threads?

8

Hier ist ein Konsolenprogramm, das 10 Threads im Batch starten, 5 Sekunden warten und im Batch anhalten soll.

%Vor%

aber das Ergebnis ist nicht das, was ich erwartet habe, 10 Threads beginnen LANGSAM (ungefähr 1 Sekunde Intervall), sogar ein "Finish" kommt vor einem "Start" heraus.

Wenn Thread.Sleep auskommentieren, beginnen und enden alle Threads im Flash.

Beeinflusst Thread.Sleep andere Threads? Gibt es überhaupt eine reine Leerlaufzeit?

/ ----------------------------- bearbeiten ---------------- -------------

Das gleiche Problem passiert auch in:

%Vor%

---------------------- Bearbeiten ------------------------

endlich habe ich einen schönen Weg gefunden, thread.sleep

zu ersetzen %Vor%     
demaxSH 01.06.2011, 02:39
quelle

3 Antworten

12

Dies ist beabsichtigt. Sie sehen, dass der Threadpool-Manager versucht, eine begrenzte Anzahl von Threads im Ausführungsstatus zu behalten. Wichtig, um sicherzustellen, dass Ihr Programm nicht mehr Threads ausführt, als Ihr Computer über CPU-Kerne verfügt. Das ist ineffizient, es wird weniger Arbeit geleistet, wenn Windows gezwungen wird, die Kerne zwischen aktiven Threads auszutauschen. Der Threadpool-Manager ist nicht intelligent genug, um zu wissen, dass der Thread inaktiv ist und keine Arbeit ausführt.

Auf einem Dual-Core-Computer werden die ersten zwei Threads sofort angezeigt. Dann dürfen weitere Threads nacheinander ausgeführt werden, wobei der Thread-Manager feststellt, dass die aktiven Threads keine Fortschritte machen und wahrscheinlich blockiert sind. Die Reihenfolge, in der Threads freigegeben werden und der Aufruf von Console.Write () ausgeführt wird, ist nicht deterministisch.

Das ist natürlich ein künstlicher Test, echte Threads schlafen nicht. Wenn Sie lange blockierende Threads haben und beispielsweise warten, bis eine E / A-Anforderung abgeschlossen ist, ist die Verwendung von Threadpool-Threads (Tasks) nicht die beste Lösung.

    
Hans Passant 01.06.2011, 03:04
quelle
5

TaskCreationOptions.LongRunning wird die ThreadPool-Beschränkung entfernen.
Ich kenne nicht den einfachen Weg, TaskCreationOptions.LongRunning für Parallel.For anzugeben.
Sie können jedoch denselben Effekt mit der Task-Klasse erzielen:

%Vor%

Ohne TaskCreationOptions.LongRunning wird es genauso laufen wie Parallel.For .

    
Alex Aza 01.06.2011 03:16
quelle
3

Ich habe den Code leicht aktualisiert, um die ThreadID beim Schreiben in die Konsole anzuzeigen:

%Vor%

Meine Maschine ist ein Dual-Core, hier ist der Output, den ich bekomme. Dies sollte Ihnen ein Gefühl dafür geben, was passiert. Denken Sie daran, dass die Schleife nicht immer in der Reihenfolge läuft, d. H. 0 bis 9, parallel ist, greift sie einen Teil Ihres Arrays und führt jedes Element durch das Lambda.

Ausgabe:

%Vor%     
Justin Largey 01.06.2011 03:12
quelle