こんにちは仲間のプログラマー、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番目のコードは実際には縮小されたコードには必要ありません。
あなたはPTreadsを使用してコードをコンパイルするときに '-pthread'を追加したい:
は
pthread_join
ドキュメントを参照してください。 – alk