私はスレッドプログラミングについて学んでいて、pthread_createから関数を呼び出すときにどのように動作するかを調べるためのテストを行っていますが、 。ここに私のコードは次のとおりです。スレッドからの印刷時に一貫性のない値
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
pthread_t *threads;
typedef struct _file {
int num1;
int num2;
} file;
void thread_run(void *thing) {
file *fp = thing;
printf("num1: %d num2: %d\n", fp->num1, fp->num2);
}
int main(int argc, char **argv) {
threads = (pthread_t *)malloc(atoi(argv[1]));
file *args = malloc(sizeof(file));
args->num1 = 0;
args->num2 = 0;
int i;
for (i = 0; i < atoi(argv[1]); i++) {
args->num1 = i;
args->num2 = i + 1;
pthread_create(&threads[i], NULL, (void *)thread_run, (void *)&args); // the (void *) cast is necessary on my linux distro
}
for (i = 0; i < atoi(argv[1]); i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
私がここに持ってしようとしています私はforループ内のスレッドを作成するときに、私は私の*スレッドポインタでそれらのすべてを格納しています。
次に、私が印刷している2つの整数値を含むstructパラメーターを使ってthread_runメソッドを呼び出します。私の知る限り
、3 ./a.out で実行このプログラムの予想される出力は次のようになります。
num1: 0 num2: 1
num1: 1 num2: 2
num1: 2 num2: 3
しかし、私は取得しています出力は毎回異なりますが、通常と一致しています次のようなものです:
num1: 34185264 num2: 0
num1: 34185264 num2: 0
num1: 34185264 num2: 0
私は同様のトピックでいくつかの質問に気付きましたが、他のユーザーの誰も私が説明した問題を抱えていないようです。
forループで毎回新しい構造体をmallocする必要がありますか? –
また、コードは 'args'を渡すべき' pthread_create() 'に'&args'を渡します。 –
@NicholasDryはい、それは可能な解決策の1つです –