0

pthread を開始し、後でこのスレッドが終了するのを待ってから戻るプログラムがあります。コードは次のようなものです。

int main(int32_t argc, char* argv[]) {
  pthread_t t;
  /* initialization and other stuff 
     ... 
  */
  printf("join result:%d\n", pthread_join(t, 0));
  return 0;
}

プログラムは、次のように出力しますjoin result: 0。したがって、結合が機能し、tが終了します。それにもかかわらず、プログラムは実行を停止しません。exit(0)行の前にコマンド(または他の番号)を挿入した場合にのみ、強制的に停止できreturn 0ます。

ただしpthread_join呼び出しで行を削除すると、プログラムは問題なく終了します。

これはどのように可能ですか?すべてのサブスレッドが結合された後、プログラムの実行が終了しない原因は何ですか?

編集: gdb が、最後の行を}. それにもかかわらず、私は舞台裏で何が起こっているのか分かりません:

Program received signal SIGSEGV, Segmentation fault.
0x000000060003aa10 in ?? ()
4

1 に答える 1

0

メインスレッドでスタック破損が発生する可能性があると思います。Windows から、main を実行する前に、exit_process 関数のアドレスがスタックにプッシュされることがわかっています。次に return 0 で exit_process 呼び出しを実行します。あなたのケースでスタックが破損していた場合、exit_process へのポインターが無効なポインターに置き換えられた可能性があります。

于 2014-06-22T06:51:57.363 に答える