Thread Problem



  • Hi, ich versuche ein Programm mit einem Thread zu schreiben. Es lässt sich ohne Probleme kompilieren, doch beim starten bekomme ich einen Speicherzugriffsfehler..

    hier mal nen bisschen code...

    void *WarteAufAnfrage(void *name)
    {
    	//int i;
    	//printf("%s",(char *)name);
    
    }
    int main(int argc, char *argv[])
    {
    	pthread_t WarteThread;
    	pthread_attr_t attr;
    	pthread_attr_init(&attr);
    	pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
    	pthread_create(&WarteThread,&attr,WarteAufAnfrage,(void *)"");
    	//pthread_join(WarteThread,NULL);
    

    auch wenn ich printf wieder einkommentiere immernoch der Speicherzugriffsfehler..

    hoffe ihr könnt mir helfen.



  • Hum. Bei mir funktioniert es. Macht zwar nichts, weil name im Thread ein leerer String ist, aber nen segfault krieg ich nicht.



  • kommentiere ich die zeile pthreade_create aus klappt es bei mir auch einwandfrei...

    wie kann das kommen das ich nen fehler bekomme??



  • Hum. Ich schieß mal ein bisschen ins Blaue. Ich nehme mal an, dass du

    #include <pthread.h>
    #include <stdio.h>
    

    am Anfang des Programms und ne schließende Klammer am Ende hast, sonst würde das nämlich gar nicht erst kompilieren. Der Code sieht soweit OK aus, also...welchen Compiler benutzt du, in welcher Version und wie rufst du den Compiler auf? Bei mir mit gcc 3.3.5 und dem Aufruf "gcc -pthread t.c" liefs.



  • ja die habe ich beide drin... und ich nutze kdevelop...

    habe auch die lib lpthread eingebunden, hoffe jedenfalls das sie mit eingebunden wird...

    kdevelop nutz ich in der neuste version die bei suse 9.2 dabei ist...



  • Kompilierst du auch mit der Option:
    -pthread



  • habe ihm kdevelop unter c++ die einstellung lpthread eingetragen



  • bekomme nur ne fehlermeldung wenn der configure neu schreibt...

    checking for gawk... gawk
    checking whether make sets $(MAKE)... yes
    checking for C++ compiler default output file name...
    configure: error: C++ compiler cannot create executables
    See `config.log' for more details.
    *** Beendet mit Status: 77 ***

    aber weiß nich ob es damit etwas auf sich hat, habe bei compileraufruf CXX lpthread eingetragen... mit -lpthread das gleiche und mit nur pthread auch der fehler...



  • Wo hast du das denn eingetragen? Die richtige Option ist -pthread



  • unter projekte->projekt einstellungen->einstellungen für configure und dann c++ hab ich jetzt -pthread eingetragen und der fehler ist immernoch da.



  • snoopdog schrieb:

    unter projekte->projekt einstellungen->einstellungen für configure und dann c++ hab ich jetzt -pthread eingetragen und der fehler ist immernoch da.

    Das gehört dort nicht hin. Du mußt beim Automake-Manager für dein Target diese Option hinzufügen, oder beim QMakeManager, wenn du den benutzt.



  • und wo finde ich das feld wo ich es eintragen muss??
    [edit]
    habs gefunden unten rechts nen menü aufklappen..
    dann hab ich auf mein projekt geklickt rechte maustaste einstellungen und dann auf biblotheken...

    dort habe ich dann -lpthread eingetragen. dann autoconf & konsorten ausgeführt und programm wieder gestartet... gleicher fehler...

    mit -pthread kommt nen fehler beim autoconf...



  • snoopdog schrieb:

    und wo finde ich das feld wo ich es eintragen muss??

    Im Automake Manager auf das Target gehen, hat oft hinten ein (Programm in bin). dann auf Einstellungen und bei den Linkerschaltern -pthread eintragen.



  • habe ich probiert... der speicherzugriffsfehler besteht immernoch...



  • snoopdog schrieb:

    habe ich probiert... der speicherzugriffsfehler besteht immernoch...

    Hmm, kannst du mal dein Programm einfach mal selbst kompilieren und schauen was dann passiert? Dann solltest du mal dein Programm durch Valgrind laufen lassen und mal schauen, wo es genau abstürzt.



  • kannst du mir sagen wie ich mit gcc mehrere cpp und header dateien compiliere ? oder muss ich mir erst ne makedatei erstellen ?? hab bisher immer mit kdevelop gearbeitet



  • Du kannst das natürlich auch über einzelne gcc-Aufrufe machen, dass ist aber natürlich aufwendig.

    Eine Makefile musst du nicht unbedingt schreiben, dafür gibt es die ultimative Makefile, die du nur noch ein wenig anpassen musst.



  • habe grade etwas ausprobiert.. ein neues Projekt erstellt was nur nen hallo ausgibt... die biblotheken bei kdevelop eingebunden und es klappt einwandfrei...

    das gleiche bei meinem projekt getan und es klappt nichts, hier mal die komplette Fehlermeldung.

    /bin/sh: line 1: 22915 Speicherzugriffsfehler ./gameservermanager
    Betätigen Sie die Eingabetaste, um fortzufahren!



  • z.B.
    g++ -I/include -L/libs -lpthread /src/foo.cpp /usr/include/bar.cpp -o TestProgramm

    Michael



  • so also ich habe es grade irgendwie hinbekommen das ich keinen Speicherzugriffsfehler mehr habe. weiß aber nicht genau wieso... aber es klappt, das komische ist nur da nix ausgeben wird...

    void *WarteAufAnfrage(void *name)
    {
    	//int i;
    	sleep(10000);
    	printf("%s",name);
    
    }
    int main(int argc, char *argv[])
    {
    	pthread_t WarteThread;
    	//pthread_attr_t attr;
    	//pthread_attr_init(&attr);
    	//pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
    	pthread_create(&WarteThread,NULL,WarteAufAnfrage,(void *)"hallo");
    	pthread_join(WarteThread,NULL)
    

    so er müsste ja jetzt 10 sekunden warten bis er was ausgibt...

    habe die zeit mal genutzt und mir alle prozesse angezeigt mit ps aux..
    da wa einmal ./gameserver und nochmal ./gameserver ; echo"Bestätigen mit Taste..."

    also so als wenn der Thread sich sofort beendet...


Anmelden zum Antworten