- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:linux 共有オブジェクトの thread-safety)
Linux共有オブジェクトのスレッドセーフ性について
このQ&Aのポイント
- 自作のWindows DLLをLinuxに移植する際、スレッドセーフな方法を模索しています。
- 現在の実装では、スレッドごとに固有のメモリ領域を割り当て、スレッド終了時に解放するための待機スレッドを作成しています。
- しかし、Linuxではpthread_join()が親スレッドが子スレッドの終了を待つ場合にしか使えないため、スレッド終了を知る方法やより良いスレッド固有領域の管理方法を探しています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
pthread_join() はスレッドIDさえわかれば親だとか子だとか関係なく使えるはずなのですが、どうやってテストしました? またpthreadにはクリーンアップハンドラという概念があるのでこれをうまく使えば同様のことが別スレッドなしで実現できます。
お礼
メインスレッドが子スレッドを作り、子が孫を作り、孫が子を pthread_join() で待つようにコードを書いてみました。それで pthread_join() がエラーを返すんですが、何か別の問題があるんでしょうね。 「クリーンアップハンドラ」ですね。調べて見ます。 有難うございました。
補足
「子は親を待てない」というのは間違いでした。 メインと孫の2つのスレッドが、子スレッドを pthread_join() しようとしたのがエラーの原因だったようです。 あるスレッドを pthread_join() できるスレッドは1個まで、ということなので、「スレッドが終了するのを待つスレッドを作る」というやりかたはダメだということがわかりました。 また、pthread_cleanup_push() 等を使ってクリーンアップハンドラーを登録するやりかたは、自分の書いた関数の中でスレッドが終了する場合は有効ですが、そうでない場合には使えないですね。 で、結局、スレッド固有資源を自動的に解放するのは諦め、ライブラリを呼び出す側のモジュールに、明示的に解放してもらうことにします。