web-dev-qa-db-ja.com

pthread_create()によって呼び出される関数への複数の引数?

別のスレッドで呼び出したい関数に複数の引数を渡す必要があります。 読み取り これを行う典型的な方法は、構造体を定義し、関数にそのポインターを渡し、引数のために逆参照することです。ただし、これを機能させることはできません。

#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 */
}

これの出力は次のようになります。

5
7

しかし、実際に実行すると次のようになります:

141921115
-1947974263

誰が私が間違っているのか知っていますか?

82
Michael

あなたが言うから

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

の代わりに

struct arg_struct *args = arguments;

68
sigjuice

つかいます

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

代わりに

struct arg_struct *args = (struct arg_struct *)args;
16
Akash Agrawal

main()には、独自のスレッド変数とスタック変数があります。ヒープ内の「引数」にメモリを割り当てるか、グローバルにします。

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

//declares args as global out of main()

もちろん、参照をargs->arg1からargs.arg1などに変更します。

4
Plamen Panov

つかいます:

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

そして、この引数を次のように渡します。

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

無料の引数を忘れないでください! ;)

2
Elham

Print_the_argumentsの引数は引数であるため、次を使用する必要があります。

struct arg_struct *args = (struct arg_struct *)arguments. 
0
Stone.Carton