2017-05-10 4 views
0

スレッド内でこのコードを実行しているときに、なぜこの回答が得られたのかを理解しようとしています。 なぜ私は毎回違う価値を得られないのか分かりません。 enter image description here複数のスレッドが一緒に値をプリントする

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define NUM_THREADS 5 

void *printHello(void *threadid) 
{ 
    int tid = *(int*)threadid; 

    printf("Hello World! It's me, thread #%d!\n", tid); 

    pthread_exit(NULL); 
} 

int main(int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc; 
    int i; 

    for (i = 0; i < NUM_THREADS; i++) 
    { 
     printf("In main: creating thread %ld\n", i,); 

     rc = pthread_create(&threads[i], NULL, printHello, &i); 

     if (rc) 
     { 
      printf("ERROR; return code from pthread_create() is %d\n", rc); 
      exit(-1); 
     } 
    } 

    pthread_exit(NULL); 
} 

彼らはそれらを作成し終えると、彼らはprintHello機能に行くまで、すべてのスレッドを待機さでしょうか?

答えて

1

新しいスレッドを作成するとき、スレッド実行の固定順序はありません。メインスレッドと新しく作成されたスレッドは、単に同時に実行されます。

あなたi変数に関する問題は、pthread_create関数にiアドレスに渡しているということです。この変数は後続のループ反復で更新されるため、そのアドレス(printHelloコールバック関数内)からアクセスするとその値が変更されます。あなたの出力では、がすでにNUM_THREADSに達しているので、生成されたスレッドのいずれかが出力される前に、main関数のループが終了したことがわかります。全てまで

int threadIds[NUM_THREADS]; 
int rc; 
int i; 

for (i = 0; i < NUM_THREADS; i++) 
{ 
    threadIds[i] = i; 
    rc = pthread_create(&threads[i], NULL, printHello, threadIds + i); 
} 

また、メインスレッド上のブロック:

あなたは物事が決定論的になりたい場合は、スレッドIDを保持し、代わりにそのスレッド用のアドレス位置に渡すために新しい変数を作成しますスポーンされたスレッドは実行を終了し、main機能ではpthread_exitを起動しません。 pthreadの内部で動いていないので、終了する必要はありません。

+0

ありがとうございました。それは明らかな答えだった –

関連する問題