PThread Initialisierung
-
Ich möchte in einer Schleife 10 pThreads nacheinander starten, die ihre "Nummern" (0-9) ausgeben sollen.
Mein Versuch:
// Example program #include <stdio.h> #include <stdlib.h> #include <time.h> #include <pthread.h> const int THREAD_COUNT = 10; typedef struct thread_arg { int id; } thread_arg_t; void* play(void *void_arg) { thread_arg_t *arg = (thread_arg_t*) void_arg; int thread_num = arg->id; printf("thread %d\n", thread_num); return NULL; } int main() { pthread_t ids[THREAD_COUNT]; thread_arg_t args[THREAD_COUNT]; for (int i=0; i < THREAD_COUNT; i++) { args[i].id = i; pthread_create(&ids[i], NULL, play, &args[i]); } return 0; }
Das scheint aber (anhand der Ausgabe) nicht korrekt zu sein.
Wo liegt mein Fehler?
-
@ravenheart_ggg sagte in PThread Initialisierung:
Wo liegt mein Fehler?
Keine Ahnung, ich weiss ja nicht, was es ausgibt.
-
Beispielausgabe bei mir:
thread 0 thread 2 thread 1 thread 3 thread 4 thread 5 thread 6 thread 7 thread 8
Hättest du etwas anderes erwartet? Denn dies ist auch das, was man vom Programm her erwarten sollte.
Oder bekommst du etwas wesentlich anderes bei dir? Hast du auch korrekt compiliert? Pthreads brauchen oft besondere Compiler und Linkereinstellungen, beim GCC z.B.
-pthread
. Problematisch sind oft auch irgendwelche pthread-Nachbauten unter Windows.
-
Ok. Zum einen hätte ich Thread 9 noch erwartet.
Bei mir ist die Ausgabe aber teils zufällig. zB:
thread 0 thread 1 thread 2 thread 3 thread 4 thread 5 thread 6 thread 7 thread 8 thread 8 thread 32767 thread 32767
-
Du musst die Threads joinen. Ansonsten kann es sein, dass das Programm beendet wird, aber immer noch Threads laufen ... und dabei insbesondere auf Daten, hier
args
, zugreifen, die bereits ungültig geworden sind.Jedenfalls erkläre ich mir die Ausgabe so:
thread 1 thread 3 thread 0 thread 2 thread 4 thread 5 thread 6 thread 7 thread 8 thread 32766 thread 32766
-
Vielen Dank.
Der join behebt die Probleme.
Mein Ziel ist nicht die stupide Ausgabe von einem Index, sondern mehr, ich wollte nur bis zu diesem Stand testen und habe das join noch nicht integriert (da ich noch an der thread-Funktion bastle)
Ich denke, man kann hier schließen.