2016-05-17 22 views
2

Linuxシステム上のスレッドでいくつかの最初のステップを実行していますが、このエラーは、n引数を取得したプログラムのベースで発生し、nスレッド数。スレッドを実行する必要がありますpthread_joinを使用した場合のセグメンテーションフォールト(終了コード139)

機能:

void* function(void* arg){ 
    int id = (long)arg; 

    printf("Thread #%ld created!\n",id); 

    pthread_exit(0); 
} 

int main(int argc, char **argv){ 

    if(argc != 3){ 
     printf("Usage: %s <num> <exp>\n",argv[0]); 
     exit(-1); 
    } 

    int num = atoi(argv[1]), exp = atoi(argv[2]); 
    long i; 
    pthread_t threads[num]; 
    pthread_attr_t attr; 

    printf("Creating %d threads \n",num); 

    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE); 

    for (i = 0; i < num; i++) { 
     pthread_create(&threads[i],&attr,function,(void*)i); 
    } 

    pthread_attr_destroy(&attr); 

    for (i = 0; i < num; i++) { 
     printf("Thread #%d is %ld\n", i, threads[i]); 
    } 

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

} 

main関数のコードの重要な部分。ここ

は、コードの重要な部分であります最後のforループを確認する私がコメントアウトするとプログラムは正常終了しますが(出口コード0)、メインプロセスが終了する前にすべてのスレッドが実行されているわけではないので、明らかに出力が間違っています。

私のLinux OSで端末を使用して実行しようとするとsegmentation fault (core dumped)と表示され、IDE(CLion)ではProcess finished with exit code 139が実行されています。

私は間違っていた何かを見つけることができませんでした。それは何かを見つけるのが難しいはずがない非常に基本的なプログラムであるため、エラーの原因となる問題は何ですか?

+2

ヒント:「セグメント化エラー」と「プロセスが終了コード139で終了しました」は同義です。 139 = 0x80 |これは、シェルが実行するプログラムがシグナル11のセグメンテーションフォルトによって終了すると、シェルが終了コードとして返すものです。 – ikegami

答えて

2

pthread_join(threads[num], NULL);の代わりにpthread_join(threads[i], NULL);を使用してください。たとえば、numが引数で4に設定されているとします。次に、threads[num]は、配列の5番目の要素を指します。これは、4つの要素の配列を割り当てたために存在しません。

+0

よく恥ずかしがり屋のような...気づかなかった、愚かな私...ありがとう! – argamanza

関連する問題