PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : threads



navi
28-09-2003, 09:47
Also ich hab irgendwie ein problem mit threads auf meinem sys.
Ich benutz gentoo und vei mir wollen alle beispielprogramme von irgendwelchen seiten net. Entweder sie lassen sich nicht direkt kompilieren oder ich bekomm beim ausführen einen Speicherzugriffsfehler.
Zum Beispiel:
#include <iostream>
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5

using namespace std;

void *PrintHello(void *threadid)
{
printf("\n%d: Hello World!\n", threadid);
pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc, t;
for(t=0;t<NUM_THREADS;t++){
printf("Creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
pthread_exit(NULL);
return 0;
}
ist ein original programm von einer seite.
Bei mir läufts aber net.
Ich kompeliers mit
g++ -o test test.cpp
und ich bekomm keine fehler.
Trotzdem bekomm ich einen Speicherzugriffsfehler.
Kann mir jemand weiterhelfen?

wraith
28-09-2003, 09:58
Hmm,bei mir läuft es.
Es sind eigentlich nur zwei Fehler drin.


printf("\n%p: Hello World!\n",threadid); //%p statt %d,ansonsten UB

und es fehlt ein return in der selbigen Funktion


pthread_exit(0);
return threadid;
}

navi
28-09-2003, 10:12
Des gibts nett.
Es geht trotzdem net.
Der beim pthread_create einen fehler.
Aber warum weiss ich net.

pik7
28-09-2003, 10:43
hallo,

bei mir funktioniert's

g++ -o test test.cpp -lpthread

mal probieren.




und es fehlt ein return in der selbigen Funktion


versteh ich nicht weil

RETURN VALUE
The !pthread_exit! function never returns.

gruß

peschmae
28-09-2003, 11:27
du musst

-lpthread

in den compileraufruf einfügen. Sonst wird die pthreads-Lib nicht gelinkt (Threads gehören nicht zum Sprachumfang von C/C++ und müssen deshalb mit einer separaten Lib hinzugefügt werden)

ups, sehe dass das pik7 ja geschrieben hat

MfG Peschmä

navi
28-09-2003, 14:37
thx
Wo kann man sowas nachlesen ob ich das machen muss oder net?

pik7
28-09-2003, 14:39
Hallo,



Wo kann man sowas nachlesen ob ich das machen muss oder net?


Was machen?

navi
28-09-2003, 16:25
Hier zb das -lpthread beim kompilieren

anda_skoa
28-09-2003, 18:10
Beim Kompilieren nicht, beim Linken.
Das ist eine Linkeranweisung.

Wenn du kompilieren und Linken in einem Schritt machst, dann natürlich auch hier.

Ciao,
_

peschmae
28-09-2003, 18:24
das musst du immer dann machen wenn du Objekte/Funktionen aus externen Bibliotheken benutzt - z. B. Pthreads oder Qt oder LibLame oder was auch immer

all die Funktionen die nicht in der Standardbibliothek sind sondern in einer anderen Lib haben einen -lwasauchimmer zur folge

MfG Peschmä

P.S. sollte auch dort stehen wo du das thread-sample herhast :eek:

pik7
28-09-2003, 18:52
hallo,

erschwerend kommt noch dazu
das bei

g++ -o test test.cpp

keine Fehlermeldung kommt

gcc -o test test.c

bekomme ich wenigstens noch

/tmp/ccWgdxVf.o: In function `main':
/tmp/ccWgdxVf.o(.text+0x7b): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

Kann mir einer erzählen warum das so ist?

gruß

peschmae
29-09-2003, 09:06
Hi,

bei mir sagen das sowohl g++ als auch gcc (2.95.4)

Wieso includest du eigentlich iostreams wenn du es dann nicht brauchst? Bzw wieso brauchst du printf wenn du iostreams includest und g++ brauchst...

MfG Peschmä

navi
29-09-2003, 10:53
Eigentlich soll das Beispiel ein C Programm sein.
Ich hab nur ein C++ Programm draus gemacht weil ich zu faul wahr dir Fehlermeldung von gcc durchzulesen.
Ich glaub des war auch mein großer Fehler.
Bei dem Tutorial stand auch weiter nichts dabei.
Naja, aus Fehlern kann man bekanntlich nur lernen :)