Kadaj Geschrieben 26. Januar 2012 Teilen Geschrieben 26. Januar 2012 Guten Abend, ich versuche mich grade an pthreads. Ich finde die Syntax recht eigenartig muss ich sagen. Das erstellen eines threads funktioniert soweit. Nun möchte ich aber mein argv[1] an meinen erstellten thread übergeben und ausgeben lassen und dieser thread soll wieder irgednwas zurückgeben an das Hauptprogramm. In der man-page steht, dass ich dazu pthread_attr_init brauche und die Adresse als Argument an die Funktion pthread_create übergebe, nur ist der Beispielcode in der man-page echt gewaltig und ich kann nicht ganz nachvollziehen was sort passiert, bzw. verstehe ich es teilweise nicht. Wie kann ich beispielsweise meinen string aus argv[1] an meinen thread übergeben? Ich habe außerdem die Stellen, die mir etwas schleierhaft sind, mit Kommentaren versehen. Hier erstmal mein code: #include <stdio.h> #include <stdlib.h> #include <pthread.h> //#define MAXITER 200000 //wozu ist das gut? void *thread_a(void *arg) { printf(" World!\n"); pthread_exit(NULL); } int main(int argc, char *argv[]) { pthread_t id; pthread_attr_t atr; int ret; if(argc!=2) { fprintf(stdout,"Error: parameter number\n"); exit(EXIT_FAILURE); } pthread_attr_init(&atr); // das scheint mir recht überflüssig, da mein atr doch bereits // vom typ pthread_attr_t ist...warum initialisieren, wenn ich es // ohnehin nur erstelle um es als Parameter zu übergeben? printf("Hello,"); ret = pthread_create(&id, NULL, (void*) &thread_a, NULL); // immer (void*), oder hängt es vom thread ab? if(ret!=0) { perror("creating 1st thread"); exit(EXIT_FAILURE); } pthread_join(id,NULL); exit(EXIT_SUCCESS); } [/PHP] Vielleicht hat ja jemand den Elan sich das mal anzusehen. Am wichtigsten wäre mir zu wissen, wie ich meinen string in den thread bekomme. Danke im voraus! Gruß, Steven Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
metux Geschrieben 30. Januar 2012 Teilen Geschrieben 30. Januar 2012 der letzte Parameter von pthread_create wird an die thread-routine übergeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 30. Januar 2012 Autor Teilen Geschrieben 30. Januar 2012 Ich versteh nicht ganz, was du damit sagen willst. Alle Parameter, die in Klammern stehen, werden an eine Funktion übergeben. Abgesehen davon ist der letzte Parameter bei mir ohnehin NULL. Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. Januar 2012 Teilen Geschrieben 30. Januar 2012 Mit pthread_attr bist du da auf dem Holzweg, keine Ahnung, woher du die Idee hast. Alle Parameter, die in Klammern stehen, werden an eine Funktion übergeben.Alle Parameter werden an pthread_create übergeben. Aber nur der letzte landet in deiner Threadfunktion. Du hast ihn dort arg genannt. Abgesehen davon ist der letzte Parameter bei mir ohnehin NULL.Dann kommt eben NULL in deiner Threadfunktion an, das ist aber nicht besonders nützlich, wenn du Daten mit dem Thread austauschen willst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 31. Januar 2012 Autor Teilen Geschrieben 31. Januar 2012 Achso war das gemeint. Ich hatte nicht verstanden, dass du den Parameter damit meintest, metux. pthread_attr hatte ich aus dem Beispiel in der man-page genommen. Das war sehr verwirrend, daher hab ich da nicht ganz durchgesehen. Mein Prof hatte mir heut auch nochmal erzählt, dass das letzte Argument als Pointer an die Funktion übergeben wird... nur warum vom Typ void und nicht vom Typ char? (siehe man-page) Dass der dritte Parameter als void* übergeben wird, sehe ich ja noch ein, aber warum auch als Parameter? char wäre doch auch nicht unlogisch, oder? Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 31. Januar 2012 Teilen Geschrieben 31. Januar 2012 Jeder Zeiger ist (in C) implizit in void* konvertierbar. void* ist in C sozusagen der generische Datentyp. Er signalisiert, dass man da alles reintun kann, was man will, dass man dafür aber auch selbst verantwortlich ist. Ein char*-Parameter signalisiert etwas ganz anderes. Zudem müsste man dann casten, sobald man etwas anderes übergeben will. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.