別のスレッドで呼び出したい関数に複数の引数を渡す必要があります。 読み取り これを行う典型的な方法は、構造体を定義し、関数にそのポインターを渡し、引数のために逆参照することです。ただし、これを機能させることはできません。
#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
誰が私が間違っているのか知っていますか?
あなたが言うから
struct arg_struct *args = (struct arg_struct *)args;
の代わりに
struct arg_struct *args = arguments;
つかいます
struct arg_struct *args = (struct arg_struct *)arguments;
代わりに
struct arg_struct *args = (struct arg_struct *)args;
main()
には、独自のスレッド変数とスタック変数があります。ヒープ内の「引数」にメモリを割り当てるか、グローバルにします。
struct arg_struct {
int arg1;
int arg2;
}args;
//declares args as global out of main()
もちろん、参照をargs->arg1
からargs.arg1
などに変更します。
つかいます:
struct arg_struct *args = malloc(sizeof(struct arg_struct));
そして、この引数を次のように渡します。
pthread_create(&tr, NULL, print_the_arguments, (void *)args);
無料の引数を忘れないでください! ;)
Print_the_argumentsの引数は引数であるため、次を使用する必要があります。
struct arg_struct *args = (struct arg_struct *)arguments.