dポイントプレゼントキャンペーン実施中!

自作の Windows dll を linux に移植しようとしています。
gcc で so を作ります。

dll は thread-safe にしてあります。その dll の関数を呼び出したすべてのスレッドに、それぞれ固有のメモリ領域を割り当てます。そして、あるスレッドが終了したら、そのスレッドに割り当てられた領域を解放することができるように、「そのスレッドが終了するのを待つスレッド」を作って待機させるようにしました。これで意図どおり動作しています。

ところが、このライブラリを linux に移植しようと、簡単なコードを書いて調べてみたところ、pthread_join() は親スレッドが子スレッドの終了を待つ場合にしか使えないことがわかりました。上の「そのスレッドが終了するのを待つスレッド」を作る、という方法が使えません。

linux で任意のスレッドの終了を知る方法はないでしょうか?
あるいは、スレッド固有の領域を管理するもっと良い方法はあるでしょうか?
それとも、linux で thread-safety なんか考える必要は無いのでしょうか?

A 回答 (1件)

pthread_join() はスレッドIDさえわかれば親だとか子だとか関係なく使えるはずなのですが、どうやってテストしました?



またpthreadにはクリーンアップハンドラという概念があるのでこれをうまく使えば同様のことが別スレッドなしで実現できます。

この回答への補足

「子は親を待てない」というのは間違いでした。
メインと孫の2つのスレッドが、子スレッドを pthread_join() しようとしたのがエラーの原因だったようです。

あるスレッドを pthread_join() できるスレッドは1個まで、ということなので、「スレッドが終了するのを待つスレッドを作る」というやりかたはダメだということがわかりました。

また、pthread_cleanup_push() 等を使ってクリーンアップハンドラーを登録するやりかたは、自分の書いた関数の中でスレッドが終了する場合は有効ですが、そうでない場合には使えないですね。

で、結局、スレッド固有資源を自動的に解放するのは諦め、ライブラリを呼び出す側のモジュールに、明示的に解放してもらうことにします。

補足日時:2007/05/09 16:02
    • good
    • 0
この回答へのお礼

メインスレッドが子スレッドを作り、子が孫を作り、孫が子を pthread_join() で待つようにコードを書いてみました。それで pthread_join() がエラーを返すんですが、何か別の問題があるんでしょうね。

「クリーンアップハンドラ」ですね。調べて見ます。

有難うございました。

お礼日時:2007/05/09 12:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!