2009-08-30 42 views
65

私は別のスレッドで呼びたい関数に複数の引数を渡す必要があります。私はreadこれを行うための典型的な方法は、構造体を定義し、その関数にポインタを渡し、引数のために逆参照することです。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 

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

+1

は、ヒープ上に割り当ててみてください? –

+1

@カーソンなぜ違いがあるのでしょうか? – sigjuice

+5

あなたの構造はあなたのスレッドと同じくらい長く生きていなければなりません。スレッドを作成し、pthread_create()を呼び出した関数から戻ると、スタックに割り当てられた構造体が他のデータによって上書きされ、スレッド関数に問題が発生する可能性があります。この例では、これは問題ではありません。作成スレッドは、ワーカースレッドが完了するのを待ってから、戻ります。 –

答えて

58

あなたの代わりに

struct arg_struct *args = arguments;

+0

うわー。ダー。ありがとう。 – Michael

+2

私はそれが最初の場所で正常にどのようにコンパイルされたのだろうか... –

+2

@sigjuice、それは私のために動作しません。コンパイルエラーが表示されます: 'void *'から 'arg_struct *'への無効な変換。 – Neshta

4

main()

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

を言うので、それは自身のスレッドとスタック変数のしています。ヒープ内の「引数」のメモリを割り当てたり、それがグローバルに次のいずれか

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

//declares args as global out of main() 

その後の進路.. args.arg1などにargs->arg1からの代わりに

15

使用

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

を参照を変更

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

使用:

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

そして、このように、この引数を渡す:

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

は、無料の引数を忘れてはいけません! ;)

0

あなたが使用する必要がありますのでprint_the_argumentsの引数は、引数である:

struct arg_struct *args = (struct arg_struct *)arguments. 
関連する問題