Multithreading und lokale Variablen
-
Hi,
mein c++ Programm besteht aus mehreren Threads. Einige dieser Threads werden jeweils nur für kurze Zeit ausgeführt und danach wieder beendet. Da das Programm über lange Zeiträume laufen soll, kommt es daher zu sehr vielen Aufrufen dieser Threads.
Die Threads haben dann jeweils eine ganze Reiher lokaler Variablen, die am Beginn des Threads z.B. folgend definiert sind:
int myint;
etc....Könnte es durch die vielen Threadaufrufe passieren, dass der Speicher im Laufe der Zeit dadurch extrem fragmentiert wird und das System in die Knie zwingt (in diesem Fall läuft das Programm übrigens auf Windows Mobile)? Wenn ja, wie könnte man eine derartige Situation verhindern?
Gruss, Gü (der sich mit Speicherverwaltung auf CE noch nicht wirklich intensiv befasst hat...)
-
Einen eigenen Thread brauchst du eigentlich nur, wenn etwas langfristig parallel zum Hauptprogramm ausgeführt werden soll - für solche kurzen Aufgaben reicht es vermutlich aus, die in einer normalen Unterfunktion auszulagern.
(und im Endeffekt bremst vermutlich das ständige Anlegen und Löschen von Threads dein System stärker aus als das Warten auf die Ergebnisse)
-
hm, ich fürchte dass die Verwendung von einfachen Unterfunktionen problematisch wäre, da die Wartezeiten doch etwas zu lange werden können. (Ein Thread versucht z.B. eine gewisse Zeit lang Daten von einem Server zu laden - als Funktion würde der Ablauf des restlichen Programms zu lange unterbrochen werden)
-
Wenn der Thread nur eine Aufgabe hat, könntest du ihn auch im Hintergrund warten lassen, bis er wieder benötigt wird:
CEvent eStopping;//Programmende - für alle Threads CEvent eStartLoading;//Achtung, ich brauche dich - für jeden Thread einzeln DWORD ThreadLoadData(LPVOID pParam) { HANDLE hEvents[2] = {eStartLoading,eStopping}; while(WaitForMultipleObjects(2,hEvents,FALSE,INFINITE)==WAIT_OBJECT_0) { eStartLoading.ResetEvent(); ... } return 0; }PS: Entscheide dich mal - laufen die Threads "nur kurze Zeit" oder brauchen sie grundsätzlich länger?
-
Sowas kann man auch asynchron erledigen.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Lokale Variablen sind kein Problem, die liegen am Stack, und den Stack haste immer. Und der liegt auch immer am Stück vor (durchgehender Speicherblock) und ist immer (solange du nix dran schraubst) gleich gross.
Ich gehe davon aus dass CE sowieso nur mit MMU läuft und Prozesse mit eigenem Adressraum hat, und wenn das stimmt musst du dir um Fragmentierung normal keine grossen Sorgen machen.
-
o.k., danke erst mal für den Tipp.
@CStoll: Alles ist relativ, nicht? Also die SW soll tagelang bis wochenlang durchlaufen, so auch einige der implementierten Threads. Andere Threads laufen max. 5-10 Minuten, was relativ gesehen sehr kurz ist, für eine synchrone Ausführung von Subroutinen allerdings viel zu lange.Mit dem Remote Heap-Walker habe ich zumindest folgende Beobachtung gemacht: nach jeder Ausführung eines der 5-10 Minuten Threads wird die Liste der Speicherblöcke im Heap länger und um etliche "Fixed" und "Free" blöcke ergänzt. Viele davon sind in der Gegend von 100kB, einige auch größer. Ich arbeite nicht mit dynamischer Speicherallokierung, sondern ausschliesslich mit lokalen Variablen in den Threads.
@hustbaer: Könnte es sein, dass lokale Variablen aus Threads (die sind wiederum in einer DLL verpackt) am Heap angelegt werden? Könnte es dann sein, dass die Fragmentierung im Laufe der Zeit trotzdem zu gross wird und das System merklich verlangsamt?
Eine Alternative wäre, die besagten Threads wirklich im Hintergund laufen und warten zu lassen - tnx für den tipp, ich werds mir mal im Detail überlegen. Nachteil: Ein Thread kann nicht mehrmals gestartet werden (was z.B. beim Übermitteln von Daten über GPRS mit all den timeouts erforderlich wäre)
-
Könnte es sein, dass lokale Variablen aus Threads (die sind wiederum in einer DLL verpackt) am Heap angelegt werden?
Nein, ganz sicher nicht.
Ich arbeite nicht mit dynamischer Speicherallokierung, sondern ausschliesslich mit lokalen Variablen in den Threads.
Sobald du Klassen wie std::string/vector/list/... verwendest arbeitest du mit Speicher vom Heap. Ganz egal ob das lokale oder globale oder sonstwas für Variablen sind.
-----
Speicher anforder (der Heap) ist unter Windows grundsätzlich *IMMER* langsam (es sei denn man verwendet eine eigene Heap Implementierung oder die Sprache die man verwendet bringt sowas mit - bei C++ eher nicht der Fall, mit MSVC sicher nicht). D.h. "relativ" langsam, also vergleichsweise langsamer als z.B. bei Linux oder FreeBSD auf der gleichen Hardware. Meist ist das aber nicht so schlimm dass man jetzt was dagegen unternehmen müsste.
Guck doch einfach mal ob
a) der freie Speicher kontinuierlich weniger wird oder
b) die Applikation kontinuierlich langsamer wirdIst beides nicht der Fall mach die einfach keine Sorgen.
-
hab inzwischen sämtliche CStrings durch fixe Chars ersetzt, somit dürfte eigentlich nix mehr im Progamm sein, das dynamisch allokiert wird und den Heap fragmentieren könnte...
Tnx jedenfalls für die wertevollen Tipps!
-
Hi,
eventuell auch überlegen ob man nicht auch auf statische Variablen ausweichen kann, die werden einmal angelegt und immer wieder verwendet.
Gruß Mümmel