0

c で pthreads プログラムを実行できません。次のプログラムの問題点を教えてください。エラーも期待される出力も得られません。

void *worker(void * arg)
{
  int i;
  int *id=(int *)arg;
  printf("Thread %d starts\n", *id );
}

void main(int argc, char **argv)
{
  int thrd_no,i,*thrd_id,rank=0;
  void *exit_status;
  pthread_t *threads;

  thrd_no=atoi(argv[1]-1);

  thrd_id= malloc(sizeof(int)*(thrd_no));
  threads=malloc(sizeof(pthread_t)*(thrd_no));

  for(i=0;i<thrd_no;i++)
  {
    rank=i+1;
    thrd_id[i]=pthread_create(&threads[i], NULL, worker, &rank);
  }

  for(i=0;i<thrd_no;i++)
  {
    pthread_join(threads[i], &exit_status);
  }
}
4

3 に答える 3

1

thrd_no = atoi(argv[1] - 1);意図したとおりに動作しない可能性があります。ウェイargvは通常、新しいプロセスに渡され、C 配列に解析されます。argv[1] - 1おそらく\0(具体的には\0の最後のargv[0]) を指しています。(より一般的には、文字列の先頭から逆方向にインデックスを作成することはほとんど正しくありません。) その結果、atoi()0 が返され、スレッドは作成されません。本当はそこで何をするつもりだったのですか?

于 2012-04-22T07:14:19.457 に答える
0

コードセグメントrank=i + 1; thrd_id [i] = pthread_create(&threads [i]、NULL、worker、&rank);

競合状態を生成します。

于 2012-04-30T13:59:54.680 に答える
0

&rank各スレッドに同じアドレスを渡しているのでid*idすべてのworker-sで同じです。

各ワーカールーチンに渡すアドレスをヒープに割り当てる方が適切です。

また、たとえば、を含め<stdint.hて使用することもできますintptr_t

 void worker (void* p)
 {
    intptr_t rk = (intptr_t) p;
    /// etc
 }

と電話

intptr_t rank = i + 1;
thrd_id[i]=pthread_create(&threads[i], NULL, worker, (void*)rank);

デバッガーの使用方法を学び、すべての警告とデバッグ情報を使用してコンパイルする必要があります。つまり、gcc -Wall -g(警告が表示されなくなるまでコードを改善してから、を使用しますgdb

于 2012-04-22T07:17:17.147 に答える