2010-12-07 11 views
0

私はプロジェクトにpthreadsを使用しています。メインスレッドとサブスレッドとそれらの間にパイプがあります。 が時々のように動作しない場合を除き、すべて正常に動作しています。サブスレッドはコマンドインタープリタを実行し、ncursesベースのGUIはパイプを介して(一部の)入力をシャトルします。pthread_exit(NULL)segfaults

Iはインタプリタスレッドは、ユーザからの「出口」コマンドを受信した場合、それはinterp_exitを呼び出し、そして

if (pthread_create(&thread, NULL, interp_start, NULL)) { perror("couldn't create thread"); return; } 

(スレッドがpthread_tファイルスコープ変数である、interp_startの関数である)は、通常のスレッドを作成します

fclose(output); 
pthread_exit(NULL); 

メインスレッドは、他のものの間で、出力のFDを調べて、FDから)S(読み取り関数を呼び出している)(選択があります。

int num=read(interp_output[0], &ch, 1); 
if (num==0) shell_done(); 
if (num==-1) perror("read"); 

スレッド内のFILE *を閉じると、select()レポートが準備され、read()が実行され、shell_done()を呼び出す0が返されます。これは、いくつかの単純なと無関係なクリーンアップの後、行われます。この時々セグメンテーション違反の

//fprintf(stderr, "joining thread\n"); 
pthread_join(thread, NULL); 
//fprintf(stderr, "joined\n"); 
exit(EXIT_SUCCESS); 

すべて。通常それは大丈夫です。これらの2つのprintfsのコメントを外すと、失敗した場合でも(pthread_exitでsegfaultsになる)、または最初のもの(pthread_joinでsegfaultsになる)のどちらも得られません。

私は他のどの時点でも「スレッド」を乱さず、ヌルポインタしか扱っていません。どうしたんだ?私は、これら2つの行のいずれかで問題が一貫して起こっていることを除いて、他の場所を探しているでしょう - 一度restore_sem_to_poolにいても。私はそれがスレッドを殺す方法でなければならないと思うが、私は可能な限り単純なことをやっている。

事前に感謝しますが...

+0

(s)(f)printfファミリの呼び出しで、引数の数と書式文字列の間にmimsatchがありますか? –

+0

'gdb'はセグメンテーションがどこで起こるかを示していますか? – caf

+0

@jim - そうは思わない。スレッド、メインプログラム、または共有変数のどこで見たいですか? – Robert

答えて

0

私はそれがこれらのすべての組み合わせだと思っていますが、問題はなくなりました。プログラムの開始後すぐに「quit」とタイプしたときに起こったのですが、私は今これを正しくデバッグする時間がなく、割当てはすでに延期されています。 @ジョン - 私は実際にこの目的のためにバンググラインドを設定していました。 [編集]私は早くそれを走らせて、この問題で私を助けませんでしたが、私は解放していないメモリを見つけました。[/ EDIT]他の人 - 皆さんはそうだと思います。メモリ破損の一種。 @caf - 私は他のスレッドをチェックするのを忘れました...しかし、私は両方のスレッドで問題を見ていました。 GDBは実際にセグメンテーションをしていたものを私に指摘していました。 [EDIT]は私が他のスレッドをチェックし、ちょうどpt_exit前にどこかで(セグメンテーション違反がpt_exitとした場合)、または[/ EDIT]

(セグメンテーション違反がpt_joinにあった場合)には、いずれかのpt_joinに待っていました

すべてに投票しますが、私はここで答えを受け入れるのは公正だとは思わない。

6

valgrind(特に "memcheck" の部分)を使用してみてください。実行時に無効なメモリアクセスを正確に特定するのに役立ちます。プログラムの実行にクラッシュしないようにすることもあります。

関連する問題