pthread_create führt zu Speicherzugriffsfehler
-
Hallo, pthread_create führt in meinem Programm immer zu einem Speicherzugriffsfehler und ich kann mir nicht erklären, woran das liegt. Der Code für den Threadaufruf ist identisch mit Beispielprogrammen die funktionieren.
Zum Testen habe ich eine möglichst kurze Version meines Programms geschrieben, bei der der Fehler auftritt:
#define _REENTRANT #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <pthread.h> void bar(); void foo(); pthread_t *createThread(); void *doStuff(void *daten); int main (int argc, char *argv[]) { bar(); } void bar() { printf("Foo"); foo(); } void foo() { pthread_t * thread; thread = createThread(); pthread_join(*thread, NULL); } pthread_t *createThread() { pthread_t *thread; // new thread identifier pthread_create(thread, NULL, doStuff, (void *)NULL); return thread; } void *doStuff(void *argument) { }
Hat jemand eine Idee wo das Problem liegt?
-
Du übergibst einen uninitialisierten Pointer an pthread_create als erstes Argument. pthread_create erwartet einen gültigen Zeiger auf ein pthread_t-Objekt.
[...] pthread_t createThread() { pthread_t thread; // new thread identifier pthread_create(&thread, NULL, doStuff, (void *)NULL); return thread; } [...]
Nicht vergessen - pthread_create hat einen Return-Value
-
dieter128 schrieb:
pthread_t *thread;
pthread_create(thread, NULL, doStuff, (void *)NULL);->
pthread_t thread; pthread_create(&thread, NULL, doStuff, (void *)NULL);
-
Also wenn ich das so ersetze bekomme ich
"error: invalid conversion from 'pthread_t' to 'pthread_t*'"ihoernchen schrieb:
dieter128 schrieb:
pthread_t *thread;
pthread_create(thread, NULL, doStuff, (void *)NULL);->
pthread_t thread; pthread_create(&thread, NULL, doStuff, (void *)NULL);
-
Versuche mal diese Variante, die sollte klappen. Da war was mit den Pointern nicht in Ordnung.
Aber mal eine andere Frage, soll es C oder C++ Code sein? Denn wenn du C++ willst und mind. einen GCC 4.4 hast, dann hast du native C++ Threads (std::thread), die deutlich einfacher sind.
#define _REENTRANT #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <pthread.h> void bar(); void foo(); pthread_t createThread(); void *doStuff(void *daten); int main (int argc, char *argv[]) { bar(); } void bar() { printf("Foo"); foo(); } void foo() { pthread_t thread = createThread(); pthread_join(thread, NULL); } pthread_t createThread() { pthread_t thread = 0; // new thread identifier pthread_create(&thread, NULL, doStuff, (void *)NULL); return thread; } void *doStuff(void *argument) { }