Speicherfehler POSIX Threads



  • Hallo,

    ich habe bei folgendem Code ein Speicherproblem (Windows XP, CYGWIN Bibliothek, GCC Compiler 3.4.4):

    void *testThread(void *data)
    {
    	double kk = 1.232231212;
    	printf("\r\n%f",kk);
    	//pthread_exit(NULL);
    	return(NULL);
    }
    
    int main (int argc, char *argv[])
    {
    	pthread_t t;
    	//start(mySignal);
    	int k = 0;
    	while(1)
    	{
    
    		pthread_create(&t,NULL,testThread,NULL);
    		pthread_join(t,NULL);
    
    	}
            return 1;
    }
    

    Wenn ich das Programm ausfuehre, dann kann man im Taskmanager beobachten, dass der benutzte Speicher des Programms immer weiter waechst. Wenn ich in der Funktion testThread nun eine Integer Variable anstatt einer double oder float Variable ausgebe, dann habe ich kein Speicherproblem. Ich kann auch beliebige Operationen in der Funktion ausfuehren, solange ich kein printf mit einer Gleitkommazahl mache. Dann kommt immer wieder das Problem. Wo ist da der Fehler? Steh ich auf dem Schlauch oder was?

    Vielen Dank fuer Eure Hilfe!

    GReetz

    <edit=kingruedi> Bitte Syntax-Coloring benutzen! sfds </edit>



  • Tja, so pauschal kann ich das nicht beantworten, aber mein Tipp wäre:

    Du erstellst ständig neue Threads:

    Fall

    1. Mit int. Einen Int auszugeben dauert sicher nicht so lange, wie eine Gleitkommazahl. Deswegen beenden sich die Threads so schnell, dass du mit "neue Threads" kreieren nicht "hinterher kommst". Anzahl der Threads stagniert.

    2. Mit float. Dauert die Ausgabe sicher länger. Du erstellst immer neue Threads, die sich aber nicht so schnell beenden können, wie du neue Threads erschaffst. Anzahl der Threads steigt ständig an -> Speicherverbrauch steigt an.

    Zum Test: In der while Schleife nach jedem Thread-Erstellen ein Sleep() einbauen, und dann testen.

    BtW: mit while(1) Threads erstellen finde ich ein wenig komisch (außer zum rumspielen)



  • das habe ich schon probiert.
    daran liegt es nicht. die threadanzahl steigt nicht. abegsehen davon duerfte das doch sowieso nicht passieren, da ich ein join ausfuehre und dieser join ohne fehlermeldung zurueckkehrt. daher sollte man doch davon ausgehen koennen, dass der thread durchgelaufen ist, oder?



  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich hab das Programm gerade auf GNU/Linux ausprobiert. Der Speicherverbrauch ist konstant bei 488 Kb geblieben. Dei Programm verhält sich unter Linux also, wie erwartet.

    Es könnte sein, dass die Cygwin Libraries den Stack der Threads nicht ordnungsgemäß freigeben. Es sich also um einen Fehler in in Cygwin handelt.

    Eine andere Theorie wäre, da Windows sehr langsam mit der Threadverwaltung ist, dass Windows die Threads erst zu einem Späteren Zeitpunkt einsammelt. Wenn jetzt mit einer Double Variable mehr Thread "verbraucht" wurde, kann es sein, dass Windows länger zum aufräumen braucht, als wie du neue Threads erstellst.

    Möglichkeit nummer drei. Deine Ausgabe wird irgendwo von der Cygwin Shell im Arbeitsspeicher gehalten und desshabl wächst der verbrauch.



  • Vielen Dank für die Info.
    Das beruhigt mich ja. Wenn der Code unter Linux laeuft, dann ist das schon mal gut. Ich werde das dann mal an CYGWIN weitertragen. Vielleicht wissen die ja Rat. Bis dahin werde ich dann einfach die Ausgabe als int casten und/oder vielleicht die boost library benutzen. Oder hat jemand noch einen anderen Vorschlag?

    Anmerkung: Warum wurde der Thread nach Linux/Unix verschoben? Es geht hier doch definitiv um ein Windows Problem. Und die CYGWIN Extensions rechtfertigen noch lange nicht den Themawechsel, oder? 😉



  • so, hab das ganze nun mit der boost library ausprobiert (auch mit cygwin und gcc)! gleiches problem. aber mit vs2005 und den windoof libraries geht es ohne speicherfehler (also createThread etc.). hier der code:

    #include "stdafx.h"
    #include "windows.h"
    
    DWORD WINAPI testThread(LPVOID lpParam)
    {
    	double k = 1.23223423;
    	printf("\r\n %f \r\n",k);
    	return 0;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HANDLE tHandle;
    
    	while(1)
    	{
    		tHandle = CreateThread(
    				  NULL,
    				  NULL,
    				  &testThread,
    				  NULL,
    				  NULL,
    				  NULL
    				);
    		WaitForSingleObject(tHandle,1000);
    		CloseHandle(tHandle);
    	}
    	return 0;
    }
    


  • Bist du dir sicher, dass Cygwin Threads über die WinAPI simuliert? Ich könnte mir vorstellen, dass es sich um Userlevel-Threads handelt.

    Vermutlich bist du mit deiner Frage besser bei den Cygwin Leuten aufgehoben, da es sich ja sehr nach einem Bug in Cygwin anhört.



  • hab das schon in der mailinglist von cygwin gepostet. bisher noch keine konkrete antwort. wenn ich was hoere poste ich es hier.



  • Hallo,
    probier mal das hier:

    void *testThread(void *data)
    {
        double kk = 1.232231212;
        pthread_detach(pthread_self());
       printf("\r\n%f",kk);
        pthread_exit((void*)0);
    }
    
    int main (int argc, char *argv[])
    {
        pthread_t t;
        //start(mySignal);
        int k = 0;
        while(1)
        {
    
            pthread_create(&t,NULL,testThread,NULL);
            pthread_join(t,NULL);
    
        }
            return 1;
    }
    

    Gruß


Anmelden zum Antworten