2012-03-01 4 views
0

メインスレッドで5つのスレッドを作成しようとしています。pthread_create未定義変数

pthread_create()関数では、毎回関数 'up'に変数として増加する 'num'値を渡しているので、各スレッドのyの値は1,2,3,4とする必要があります。 5をそれぞれランダムな順序で含む。

しかし、yの値をチェックする関数 'up'のprintf( "numを前に追加する%d \ n"、y)がyが未定義であることを示しています1から5までの数字。

このパラレル入力の問題を解決するにはどうすればよいですか。

const int TOTAL_RUNS = 1000000; 

void *up(void *ptr) { 
    int i; 
    int y = *((int*)ptr); 
    printf("before add num is %d\n", y); 

    for (i = 0; i < TOTAL_RUNS; i++) 
    y++; 

    printf("Finished adding 1 a total of %d times.\n", TOTAL_RUNS); 
} 

void main() { 
    int num = 1; 
    pthread_t t[5]; 
    int i; 

    for (i = 0; i < 5; i++) { 
    pthread_create(&t[i], NULL, up,(void*) &num); 
    num++; 
    } 

    for (i = 0; i < 5; i++) { 
    pthread_join(t[i], NULL); 
    } 
} 
+0

http://stackoverflow.com/q/9498440/841108また私の返信http://stackoverflow.com/a/9498820/841108 –

答えて

3

問題は、あなたがすべてのスレッドに同じアドレスを渡しているある - (あなたがそれらのそれぞれに&numを渡されたので)、各スレッドが同じメモリ位置へのアクセス権を持っています。あなたがスレッドがある前に、スコープの外に行くことはありません(同じスレッドに参加numsを呼び出すので、

int nums[] = {1, 2, 3, 4, 5}; 
/* ... */ 

pthread_create(&t[i], NULL, up, &nums[i]); 

安全でなければなりません:あなたはこの問題を解決することができ

最も安い方法は、配列を使用することです完了)。

+0

また、 'static const char nums [5];'をファイルスコープで 'nums + i'を渡した後、スレッド関数の' ptr-nums'を引いて 'i'を戻します。 :-) –