2016-05-22 19 views
0

こんにちは仲間のプログラマー、C - pthread_joinを()ハング(時々)

私はpthreadのでCで簡単なマルチスレッドプログラムを書きたい、何とかpthread_joinをがハングするようです。 いつもそうではないようですが、たいていはすべてがうまく動いています。次回は最初のスレッドでagaingを掛けます。

コードを最小限に抑えて、他の問題を除外できるようにしました。完全なコードでは、もちろん、スレッドはいくつかの計算を行いました。しかし、このコードは非常に少なくても問題は解決しません。また、複数のマシンで、異なるOSを使用しています。

straceのは、吊りFUTEX_WAITとは何か、完全な最後の行を持っていることを私に示しています

write(1, "Joining Thread 0...\n", 20Joining Thread 0... 
) = 20 
futex(0x7fff61718a20, FUTEX_WAIT, 1634835878, NULL 

私はGDBでそれをデバッグしようとしましたが、私の貧弱なデバッグの静止画は非常に限られている、特にマルチでスレッド化されたプログラム。 別のC標準(C99とAnsi)と両方のpthreadパラメータ(-lpthread、-pthread)を使用してコンパイルしようとしましたが、問題は解決しません。

(縮小)コードmonte2.c:

#include <stdio.h> 
#include <pthread.h> 

void *monte(struct MonteArgs *args) { 
    pthread_exit(NULL); 
} 

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

    int numThreads, numSamples; 
    int i; 

    if (argc != 3) { 
    printf("Usage: monte threads samples\n"); 
    exit(1); 
    } 

    numThreads = atoi(argv[1]); 
    pthread_t threads[numThreads]; 
    numSamples = atoi(argv[2]); 

    for (i=0; i<numThreads; i++) { 
    if (pthread_create(&threads[i], NULL, monte, NULL)) { 
     printf("Error Creating Thread %d!\n", i); 
     return 1; 
    } 
    } 

    for (i=0; i<numThreads; i++){ 
    printf("Joining Thread %d...\n", i); 
    pthread_join(&threads[i], NULL); 
    } 

    printf("End!\n"); 
    fflush(stdout); 
    return(0); 
} 

Iは

gcc monte2.c -lpthread -o monte 

してコンパイルし、最初の引数は、スレッドの数である

./monte2 3 100 

で実行、 2番目のコードは実際には縮小されたコードには必要ありません。

+0

あなたはPTreadsを使用してコードをコンパイルするときに '-pthread'を追加したい:

pthread_joinドキュメントを参照してください。 – alk

答えて

3

私はマルチスレッドのCを行ってからしばらくしていますが、コンパイラの警告を無視してはいけません:-)。 -Wallでコンパイルしてください。

あなたはこのような警告を見てする必要があります。

note: expected 'pthread_t' but argument is of type 'pthread_t *' 
int  WINPTHREAD_API pthread_join(pthread_t t, void **res); 

あなたがpthread_tを渡すべきであるときは、pthread_t*を渡しています。 http://man7.org/linux/man-pages/man3/pthread_join.3.html

+0

ありがとうございました! :-)このシンプルなことは固定されています。私はそれがいつもではないことが非常に奇妙で、私は単純な例を使って私の単純化されたプログラムをクロスチェックしたので、 。 – juks

関連する問題