Ich habe einige Probleme damit, meine Threads in der richtigen Reihenfolge auszugeben. Mein Programm muss mindestens 2 Parameter annehmen (es könnten mehr sein, aber immer 2 gleichzeitig, da einer eine Ganzzahl ist (wie viele Sekunden wartet der Thread) und der andere ein Zeichen* (nur eine normale Nachricht)). Die Ausgabe des Programms ist die Threadnummer (Index) und die Nachricht aus dem zweiten Parameter, aber die Threads müssen basierend auf der Zeit sortiert werden, die sie seit dem ersten Parameter hatten. Der Hauptthread muss auf alle anderen Threads warten. Es wird maximal 10 Threads geben.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
void* thread_main(void* arg){
sleep(1);
return NULL;
}
int main(int argc, char** argv){
pthread_t tid[10];
int s;
int index=0;
for(int i=1;i<argc;i+=2){
int param1= atoi(argv[i]);
char* param2= argv[i+1];
s=pthread_create(&tid[index],NULL,thread_main,NULL);
usleep(param1*1000);
printf("Thread %d : %s\n",index+1,param2);
index++;
}
for(int i=0;i<index+1;i++){
s=pthread_join(tid[i],NULL);
}
return 0;
}
Das ist mein Code. Wenn ich die Parameter für den Code eingebe:
300 dies_ist_letztes 100 dies_ist_erstes 200 dies_ist_mittleres
Die Ausgabe sollte folgendermaßen aussehen:
Thread 2 : this_is_first
Thread 3 : this_is_middle
Thread 1 : this_is_last
Aber mit meinem Code erhalte ich Folgendes:
Thread 1 : this_is_last
Thread 2 : this_is_first
Thread 3 : this_is_middle
Ich bin neu in den Threads und weiß wirklich nicht, wie ich das beheben kann.
Antwort1
Wenn man sich den Code ansieht. Es gibt keine Ausgabe innerhalb der Threads. Daher tut das Threading nichts. Sie können create_thread entfernen, und es wirdgenaudas gleiche.
Die Ausgabe erfolgt in sequenzieller Reihenfolge. Mit unterschiedlichen Zeiten (je nach den geraden Parametern).
Außerdem wird jeder Thread als thread_main bezeichnet.
Was zu tun.
Fügen Sie die unterschiedliche Verzögerung und das printf
in thread_main ein. (Und geben Sie ihm einen besseren Namen.) Anschließend müssen Sie die Nachricht und die ID an den Thread übergeben.
SehenHandbuchfür ein Beispiel, wie es geht. Hinweis tinfo
wird an den Thread weitergegeben.
Ich würde mit 3 Routinen beginnen, eine für jeden Thread, mit unterschiedlichen Nachrichten und IDs. Wenn das funktioniert, beginnen Sie zu untersuchen, wie Sie ihnen beim Start Informationen übermitteln können.