0

主に次の部分を検討してください

     tcount = 0;
     for (i=0; i<2; i++) {
      count[i] = 0;
      if (pthread_create(&tid[i], NULL, randint, (void *)&i) != 0) {
           exit(1);
      } else {
           printf("Created Thread %d\n", i);
      }
//        XXXXXXX
     }

     for (i=0; i<nthreads; i++) {
      printf("Waiting for thread %d to terminate\n", i);
      pthread_join(tid[i], NULL);
     }

randint コードは次のとおりです。

void *randint(void *pint)
{
     int j, k;
     int rseed;

     j = *((int *)pint);
     printf("Started thread %d\n", j);
     while (tcount++ < NMAX) {
      count[j] += 1;
     }
     return(NULL);
}

出力は次のとおりです。

Created Thread 0
Created Thread 1
Waiting for thread 0 to terminate
Started thread 0
Started thread 0
Waiting for thread 1 to terminate

出力に次のようなものがある理由がわかりません。

Started thread 0
Started thread 0

私はそれがあったかどうかを理解しています:

Started thread 0
Started thread 1

または:

Started thread 1
Started thread 1

しかし、2つのゼロは明確ではありません!!! 推測は?

4

1 に答える 1

2

あなたの問題はここにあります:

if (pthread_create(&tid[i], NULL, randint, (void *)&i) != 0) {

これは、その値を渡す必要がある場合のアドレスを渡しています。通常、ハックとしてi整数を として渡すだけです。void *

if (pthread_create(&tid[i], NULL, randint, (void *)i) != 0) {
...
// in the thread we cast the void * back to an int (HACK)
j = (int)pnt;

gets が 0 にリセットされる理由は、次のループでi再利用しているためです。i

for (i=0; i<nthreads; i++) {
  printf("Waiting for thread %d to terminate\n", i);
  pthread_join(tid[i], NULL);
}

しかし、ここでこのループを使用したとしても、スレッドが開始するまでに、比較的長い時間がかかるため、おそらく の値が変更されているため、取得jできません。2 番目のループで使用すると、おそらく次のようになります。Started thread 01ipthread_create(...)j

Started thread 1
Started thread 1

iによってスレッドに渡すことは、ここで行うべき正しいことです。アドレスが必要な場合は、そのコピー用のスペースを割り当てる必要があります。

int *pnt = malloc(sizeof(i));
*pnt = i;
if (pthread_create(&tid[i], NULL, randint, (void *)pnt) != 0)
...
// remember to free it inside of the thread
于 2013-10-02T17:44:57.073 に答える