2012-01-04 9 views
4

スレッドを使用しているときに、スレッドが終了まで実行されているが、デタッチされていないスレッドはゾンビ状態にあり、結合で刈り取られるのを待っているか、またはリソースをクリーンアップできるように切り離されます。スレッドは、終了したときにスタックが持続していると、スタックが解除されない理由は何ですか?

スレッドがゾンビのときにクリーンアップされない2つの「リソース」は、スタックと戻り値です。

誰かが、結合が行われるまでスタックを持続させるロジックを教えてもらえますか?戻り値が別の場所にある場合、私は正当な理由があるとは思えませんが、スレッドが使用されていることを知りたいと思います。

+0

これはOSに非常に依存する質問だと思います。また、スタックメモリが解放されていないことをどのように伝えることができますか? –

+0

戻り値がスタックに格納されている可能性がありますか?しかし、一般的にこれは非常にシステムに依存します。 –

答えて

4

スタックを生かしておく技術的な実装が簡単です。スレッドの実装では、スケジューラから現在のスレッドを登録解除する場合でも、スタックの最下部を作業領域として使用できます。その後、join()を呼び出すスレッドのコンテキストを使用して領域を削除できます。

join()の前、つまり終了スレッドのコンテキストでスタックを削除すると、スタックの削除とスレッドの登録解除の間に短時間のスタックやその他のメモリがなくなります。

3

スレッドが終了するとすぐにスタックを再利用するかどうかは、OSによって異なります。

次のスレッドは良い読まれます:linkです。

私はロジャー・フォークナーによって、次のポストは非常に興味深い見つける:

少なくともSolaris 9および10で、 によって割り当てられたスレッドのスタックが(MMAP()を使用して) ライブラリはすぐに再利用のために解放されますスレッド時 終了。 thread-idと の戻り値を含むスレッド構造体は、pthread_join()(またはpthread_detach())まで解放されません。

新しいスレッド の高速再利用のために、最大10個のスレッドスタックのキャッシュが保持されます。キャッシュ限界を超えた古いスタックはmunmap()です。

自分のUbuntuシステムでは、pthread_join()が呼び出されるまでスタックは再利用されません。私はこれが意識的な意思決定ではなく実装の人為的なものであると考えています。

関連する問題