Ressourcenverbrauch: Thread startet zwei weitere Threads
-
Hallo Leute,
ich habe mal wieder eine dumme Anfängerfrage:
Ich habe einen Thread, der in einer while-Schleife kontinuierlich Messdaten erhält und verarbeitet (inkl. Ausgabe auf GUI) und zuvor eine Funktion StartMeasurement() ausführt, welche Ihrerseits zwei Threads startet, die ebenfalls jeweils in einer while-Schleife Messwerte von zwei Hardware-Modulen abgreifen. Verarbeitet werden die Messwerte nun wieder im ersten Thread.Nun meine Frage: Wenn ein Thread zwei weitere startet, werden dann die Ressourcen dieses Threads für die beiden anderen Threads geteilt oder laufen die komplett unabhängig und erhalten volle Ressourcen?
Irgendwie wird die Performance nämlich sehr schlecht, wenn ich beide Hardware-Threads starten lasse, bei nur einem funktioniert alles wunderbar.
Vielen Dank für eure Hilfe,
Jonson
-
Was meinst du mit Resourcen?
Die CPU-Zeit muss natürlich geteilt werden. Der Heap wird auch geteilt. Aber jeder Thread kriegt einen eigenen Thread.Nach deiner Beschreibung vermute ich, dass die "Hardwarethreads" endlosschleifen ohne sleep ausführen und daurch jede Menge CPU-Zeit auffressen.
Wenn du wirkliche pollen willst/musst, dann solltest du sleeps einbauen. Noch besser ist es mit interrupts oder soetwas wie messages (je nachdem wie nah du an der hardware bist) zu arbeiten, so das die Threads nur aktiv werden, wenn wirklich etwas zum Verarbeiten da ist.Um was für eine Hardware handelt es sich denn und worüber liest du sie aus?
-
Ein Thread hat in der Regel nur einen Kontext, mehr nicht.
Der wird selbstverständlich nicht geteilt, ist aber auch nicht teuer.Faustregel: Mehr Threads laufen zu lassen als CPU-Cores vorhanden sind, drückt die Performance.
-
okay, schon einmal danke für die Hilfe.
Die Sleeps bringen mir definitiv einiges. Jetzt muss ich nur noch mal überprüfen, wie viele Daten ich in dieser Zeit dann eventuell verliere.
Ich melde mich wieder

Vielen Dank und Grüße,
Jonson
-
Manchmal reicht es schon, statt sleep() ein yield() auszuführen.
EDIT: Plus: Es macht sicher Sinn auch die bereits erwähnte Interrupt-basierte Verarbeitung noch mal zu überdenken. Oder hast Du das schon verworfen?
-
Wenn ein Thread lange warten muss, solltest du dein Programm nochmal überdenken.