2016-11-15 3 views
2

私はスレッドプログラミングについて学んでいて、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 

私は同様のトピックでいくつかの質問に気付きましたが、他のユーザーの誰も私が説明した問題を抱えていないようです。

答えて

2

すべてのスレッドには、まったく同じ構造体へのポインタがあります。したがって、同じ値が出力されます。 forループ内の各スレッド用の新しい構造体malloc()が必要です。

また、argsfile *argsと宣言されています。これはすでにポインタなので、アドレスではなく直接渡すべきです。

pthread_create(&threads[i], NULL, (void *)thread_run, (void *)args); 
+0

forループで毎回新しい構造体をmallocする必要がありますか? –

+2

また、コードは 'args'を渡すべき' pthread_create() 'に'&args'を渡します。 –

+1

@NicholasDryはい、それは可能な解決策の1つです –

関連する問題