私はプロジェクトに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にいても。私はそれがスレッドを殺す方法でなければならないと思うが、私は可能な限り単純なことをやっている。
事前に感謝しますが...
(s)(f)printfファミリの呼び出しで、引数の数と書式文字列の間にmimsatchがありますか? –
'gdb'はセグメンテーションがどこで起こるかを示していますか? – caf
@jim - そうは思わない。スレッド、メインプログラム、または共有変数のどこで見たいですか? – Robert