CPU-Auslastung bei ~50% durch einen Thread
-
Servus,
ich habe innerhalb eines Threads, der nicht per Sleep aufgehalten wird eine Auslastung von rund 50% innerhalb meiner while Schleife - auch wenn ich jeglichen Inhalt entferne.
Ist das normal? Kann ich dagegen etwas tun?Adde ich selbst ein Sleep(1) liegt die CPU-Auslastung bei lässigen 5%...
Brauch ich generell ein Sleep?Grüße,
Jöran
-
Was verstehst du unter Auslastung? Was ist es fuer eine CPU? Ist Hypertreading aktiviert?
-
Ich verstehe das Problem auch nicht.
Wenn Du in einem Thread eine leere while-Schleife laufen lässt, dann macht die zwar nichts, aber auch die Schleife sekbst verbraucht Rechenzeit. Ein Kern wird dabei zu 100 Prozent ausgelastet.
-
Brauch ich generell ein Sleep?
Nein. Du musst erstmal verstehen wie Computer funktionieren.
-
Ist eine 2-Kern CPU.
Wie finde ich das raus, ob Hyperthreading aktiviert ist?Ich mein die zusammengefasste CPU-Auslastung im Task Manager. Hast schon recht. Eine CPU läuft auf 100%.
Hilf mir doch bitte dabei, zu verstehen wie das Ding funzt. Ich würde es nämlich gern optimieren.
Vielen Dank
-
Jöran schrieb:
Servus,
ich habe innerhalb eines Threads, der nicht per Sleep aufgehalten wird eine Auslastung von rund 50% innerhalb meiner while Schleife - auch wenn ich jeglichen Inhalt entferne.
Ist das normal?Vollkommen. Unter
while(isTrue()) ;Versteht die CPU:
LABEL: if (isTrue()) goto LABEL;Sprich: die testet andauernd isTrue(), springt, testet, springt, testet, springt, testet, spring, testet, springt..... ohne Unterbrechung, d.h. natuerlich sind das 100% Auslastung.
Kann ich dagegen etwas tun?Den Thread "schlafen legen":
- Sleep am Schleifenende
- Mutex/Semaphore wenn der Thread nicht gebraucht wird
-
Jöran schrieb:
Ist eine 2-Kern CPU.
Wie finde ich das raus, ob Hyperthreading aktiviert ist?Ich mein die zusammengefasste CPU-Auslastung im Task Manager. Hast schon recht. Eine CPU läuft auf 100%.
Also du hast 2 Arbeiter. Dem einen gibst du Arbeit und er ist zu 100% beschaeftigt. Der andere langweilt sich und ist zu 0% beschaeftigt. Das macht im Mittel ... tataa ... 50% Beschaeftigung. Die Frage lautet also: Wie kann ich den anderen Arbeiter auch zu 100% beschaeftigen? Aber vorher solltest du den Rat von hustbaer beherzigen.
-
knivil schrieb:
Die Frage lautet also: Wie kann ich den anderen Arbeiter auch zu 100% beschaeftigen?
Ich bin mir gar nicht sicher, ob das wirklich die Frage ist. Ich schätze Jöran will einfach nur die Auslastung reduzieren. Wahrscheinlich sollte er einfach Polling durch Mutex + Wait + Notify ersetzen.
Jöran: Wenn Du nichts zu tun hast, solltest Du dem Betriebssystem das auch signalisieren. Dann teilt das OS Deinem Thread keine CPU-Zeit mehr zu. Wenn Du auf eine bestimmte Bedingung wartest, solltest Du Thread A auf eine Art und Weise schlafen legen, so dass ein anderer Thread B den Thread A wieder aufwecken kann, wenn die Bedingung erfüllt ist.
sleepbenutzt man dafür aber selten. Threading-Bibliotheken bieten dafür Mutexes und Bedingungsvariablen an.