2012-04-22 5 views
0

私はpthreadsプログラムをcで実行できません。以下のプログラムで何が問題なのか教えてください。私はエラーも予想される出力も得られません。pthreadプログラムの後に何が問題になっていますか?

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); 
    } 
} 
+2

まあ、あなたのプログラムは、行数と同じ数の警告を作成します。いくつかのインクルードを追加し、警告を整理することを検討してください。コンパイラは厄介な驚きについてあなたに話すことにかなり優れており、警告に注意する必要があります。 – zmccord

答えて

1

thrd_no = atoi(argv[1] - 1);おそらく意図した通りにできません。 は、おそらく\0(具体的には、argv[0]の末尾にある\0)を指しています。 (より一般的には、文字列の先頭から後ろに向かってインデックスを作成することはまれです)結果はatoi()が0を返し、スレッドは作成されません。あなたは実際にそこで何をしたかったのですか?

+0

いいえを作成したいと思います。スレッドの数は1より小さい。ユーザによって入力される。 – Aps

+0

これは 'atoi(argv [1]) - 1'です。また、ユーザーがエラーチェックの不足を考えれば、数字以外の数字や「0」を渡すとどうなるか考えてみてください。 – geekosaur

0

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

各ワーカールーチンに渡すアドレスをヒープに割り当てるのがよいでしょう。

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

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

とあなたが、その後、デバッガを使用することを学ぶとすべての警告とデバッグ情報でコンパイルし、すなわちgcc -Wall -g(と、それは何の警告を取得しなくなるまで、あなたのコードを改善する必要があり

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

を呼び出しますgdb

0

コードセグメントランク= i + 1; thrd_id [i] = pthread_create(&スレッド[i]、NULL、ワーカー、&ランク);

は、競合状態を生成します。

関連する問題