2011-01-12 34 views
20

Visual Studio C++で、beginthreadex、endthreadexという呼び出しを使用してマルチスレッドプログラミングを行っていました。親スレッド終了時に子スレッドが終了する

子スレッドthread1を作成します。子スレッドは、無限ループを持つため終了しない関数で実行されます。親スレッドがエラー終了または正常終了した場合、子スレッドも終了しますか?私の疑いは、メインプログラムが終了しても子スレッドが生き残っている状況はありますか?

Linuxの場合はどうすればよいですか?

+1

よくある質問です:http://stackoverflow.com/questions/2197699/is-it-necessary-to-explicitly-stop-all-threads-prior-to-exiting-a-win32-applicati – sharptooth

+0

投稿に矛盾する回答があります。 – excray

+0

@ user97642あなたの視点から見た競合は何ですか?答えはすべて私に似ているようです。 –

答えて

31

スレッド間に親子関係はありません。スレッドAがスレッドBを作成し、その後スレッドAが終了すると、スレッドBは引き続き実行されます。

例外は、メインスレッド(すなわち、main()関数を実行するスレッド)が終了する場合です。これが起こると、プロセスは終了し、他のすべてのスレッドは停止します。

+5

2つの例外。 *任意の*スレッドが 'exit'を呼び出すと、* all *スレッドは終了します。 – EML

+1

また、 'main'が実行中のスレッドで' detach'を呼び出さずに存在する場合、例外がスローされることを追加したいと思います。 – Everyone

7

CとC++ mandate that returning from the main function kills all running threadsであるので、処理は終了する必要があります。そしてその動作はランタイムによって行われるので、状況はLinux上で同じでなければならない。

+0

あなたが提供したリンクは、すべてのスレッドを*殺す*(!)の言語要件については何も言いません。 mainからの返り値がexit()の呼び出しと同等であるという要件だけを挙げています。 –

2

とすぐにあなたのプロセスが死ぬと、すべてのリソースが(メモリ、ファイルやスレッドを)解放されている

これを行うための正しい方法:あなたがbeginthreadを呼び出すとき、親スレッドに返されたハンドルを維持し、プログラムを終了する前にWaitForObjectを呼び出してください(は、子スレッドを持つ親スレッドに参加します)。

親スレッドは、子スレッドが終了するまでブロックします。子スレッドに無限ループがある場合は、「中断ポイント」を定義して、退出する必要があるかどうかを確認できます。たとえば、共有ブール変数を使用します。詳細についてはInterrupt Politelyを確認してください。

+0

プログラムが正常に終了した場合、つまりmain()の終わりに達した場合、あなたのケースは問題ありません。しかし、exit()を呼び出すプライマリスレッドまたは親スレッドには多くの場所があります。 exit()はすべてのスレッドを終了させるでしょうか? – excray

+0

@ user97642メインスレッドが終了すると他のすべてのスレッドが停止する –

+2

セマフォ、ハンドルなど無限に待機すると、WindowsとLinuxの両方でプロセスがゾンビになる可能性があることに注意してください。そうでなければ、それは他の人が言うようにです。メインスレッドが死んだとき、他のすべてが殺されます。 – JimR

関連する問題