2016-12-01 7 views
0

初期化中にワーカースレッドを作成する共有ライブラリを使用しています。このアプリはuClibcにリンクされています。 main()から復帰すると、__pthread_cond_wait()などのクラッシュで、共有スレッドがクリーンアップ()コードから正しく停止しないワーカースレッドからクラッシュします。メイン()スレッドスタックには、クラッシュしたときです:exit()中にuClibc共有ライブラリがアンロードされる

#0 _dl_munmap from uClibc.so 
#1 _dl_fini 
#2 __GI_exit 
#3 __uClibc_main 

私は労働者のクリーンアップコードを修正することはできません共有ライブラリのソースを持っていないが、私の質問があるので:

されている理由uClibcが共有ライブラリのアンロードを開始しても、スレッドはまだ動作しています(クラッシュします)?私はそれが上記の_dl_munmapスタックエントリからそれらをアンロードしていると仮定します。 main()が終了したときにすべてのスレッドが一時停止/停止されていることを確認する方法はありますか?

答えて

1

はなぜまだ

を実行しているスレッドですあなた(またはあなたがにリンク共有ライブラリ)を実行し、それらを残したので。 あなたがスレッドの手配をする必要が終了する:)(メインは

はい

を終了すると

すべてのスレッドが一時停止されていることを確認する方法はあります/停止。共有ライブラリのソースにアクセスすることができなければ、それを実際に行うことはできません。唯一の他の選択肢は、exitの代わりに(またはmainから戻る)_exit(クリーンアップを実行しないでください)を呼び出すことです。

+0

libcが終了時に共有ライブラリをmunmap()している間に、スレッドがまだ実行されている可能性があるというposixの動作があるとしますか? – patraulea

関連する問題