Mehrere Argumente für die von pthread_create() aufgerufene Funktion?

Lesezeit: 4 Minuten

Ich muss mehrere Argumente an eine Funktion übergeben, die ich in einem separaten Thread aufrufen möchte. Ich habe lesen dass der typische Weg, dies zu tun, darin besteht, eine Struktur zu definieren, der Funktion einen Zeiger darauf zu übergeben und sie für die Argumente zu dereferenzieren. Allerdings bekomme ich das hier nicht zum Laufen:

#include <stdio.h>
#include <pthread.h>

struct arg_struct {
    int arg1;
    int arg2;
};

void *print_the_arguments(void *arguments)
{
    struct arg_struct *args = (struct arg_struct *)args;
    printf("%d\n", args -> arg1);
    printf("%d\n", args -> arg2);
    pthread_exit(NULL);
    return NULL;
}

int main()
{
    pthread_t some_thread;
    struct arg_struct args;
    args.arg1 = 5;
    args.arg2 = 7;

    if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0) {
        printf("Uh-oh!\n");
        return -1;
    }

    return pthread_join(some_thread, NULL); /* Wait until thread is finished */
}

Die Ausgabe dafür sollte sein:

5
7

Aber wenn ich es ausführe, bekomme ich tatsächlich:

141921115
-1947974263

Weiß jemand was ich falsch mache?

  • versuchen Sie es auf dem Heap zuzuweisen?

    – Carson Myers

    30. August 2009 um 0:56 Uhr

  • @Carson Warum sollte das einen Unterschied machen?

    – Sigissaft

    30. August 2009 um 1:04 Uhr

  • Ihre Struktur sollte mindestens so lange leben wie Ihr Faden. Wenn Sie einen Thread erstellen und von der Funktion zurückkehren, die pthread_create() aufgerufen hat, wird die auf dem Stack zugewiesene Struktur möglicherweise von anderen Daten überschrieben und kann Probleme in Ihrer Thread-Funktion verursachen. In diesem Beispiel ist das kein Problem, da der erstellende Thread wartet, bis der Worker-Thread abgeschlossen ist, bevor er zurückkehrt.

    – Commodore Jäger

    30. August 2009 um 2:55 Uhr

  • @ Commodore Jaeger Oh! Danke, das ist das Problem, das ich mit dem anderen hatte, mit dem ich gearbeitet habe. Ich habe es behoben, indem ich es mit malloc() auf dem Heap zugewiesen habe, wie Carson sagte. Das macht jetzt viel mehr Sinn.

    – Michael

    30. August 2009 um 11:27 Uhr

Weil du sagst

struct arg_struct *args = (struct arg_struct *)args;

Anstatt von

struct arg_struct *args = arguments;

  • @sigjuice, es funktioniert nicht für mich. Ich sehe einen Kompilierungsfehler: Ungültige Konvertierung von „void*“ in „arg_struct*“.

    – Neschta

    15. Oktober 2014 um 17:17 Uhr

  • @Neshta: Das bedeutet, dass Sie keinen C-Compiler verwenden, aber wahrscheinlich einen C++-Compiler. In diesem Fall sollten Sie wahrscheinlich verwenden std::thread stattdessen

    – Chris Dodd

    1. Oktober um 2:06

verwenden

struct arg_struct *args = (struct arg_struct *)arguments;

anstelle von

struct arg_struct *args = (struct arg_struct *)args;

Benutzeravatar von Plamen Panov
Plamen Panow

main() hat seine eigenen Thread- und Stack-Variablen. Weisen Sie entweder Speicher für ‘args’ im Heap zu oder machen Sie ihn global:

struct arg_struct {
    int arg1;
    int arg2;
}args;

//declares args as global out of main()

Dann ändere natürlich die Referenzen ab args->arg1 zu args.arg1 etc..

Elhams Benutzeravatar
Elham

Verwenden:

struct arg_struct *args = malloc(sizeof(struct arg_struct));

Und übergeben Sie diese Argumente wie folgt:

pthread_create(&tr, NULL, print_the_arguments, (void *)args);

Gratis-Argumente nicht vergessen! 😉

Benutzeravatar von VeeDub
VeeDub

Ich habe die gleiche Frage wie der ursprüngliche Poster, Michael.

Ich habe jedoch erfolglos versucht, die eingereichten Antworten für den ursprünglichen Code anzuwenden

Nach einigem Ausprobieren ist hier meine Version des Codes, die funktioniert (oder zumindest für mich funktioniert!). Und wenn Sie genau hinsehen, werden Sie feststellen, dass es sich von den früher veröffentlichten Lösungen unterscheidet.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

struct arg_struct
{
   int arg1;
   int arg2;
} *args;

void *print_the_arguments(void *arguments)
{
   struct arg_struct *args = arguments;
   printf("Thread\n");
   printf("%d\n", args->arg1);
   printf("%d\n", args->arg2);
   pthread_exit(NULL);
   return NULL;
}

int main()
{
   pthread_t some_thread;
   args = malloc(sizeof(struct arg_struct) * 1);

   args->arg1 = 5;
   args->arg2 = 7;

   printf("Before\n");
   printf("%d\n", args->arg1);
   printf("%d\n", args->arg2);
   printf("\n");


   if (pthread_create(&some_thread, NULL, &print_the_arguments, args) != 0)
   {
      printf("Uh-oh!\n");
      return -1;
   }

   return pthread_join(some_thread, NULL); /* Wait until thread is finished */
}

Benutzeravatar von Floern
Floern

Die Argumente von print_the_arguments sind Argumente, also sollten Sie Folgendes verwenden:

struct arg_struct *args = (struct arg_struct *)arguments. 

Benutzeravatar von Scalway
Scalway

struct arg_struct *args = (struct arg_struct *)args;

–> diese Zuweisung ist falsch, ich meine, das variable Argument sollte in diesem Zusammenhang verwendet werden. Prost!!!

1422800cookie-checkMehrere Argumente für die von pthread_create() aufgerufene Funktion?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy