![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
自作の Windows dll を linux に移植しようとしています。
gcc で so を作ります。
dll は thread-safe にしてあります。その dll の関数を呼び出したすべてのスレッドに、それぞれ固有のメモリ領域を割り当てます。そして、あるスレッドが終了したら、そのスレッドに割り当てられた領域を解放することができるように、「そのスレッドが終了するのを待つスレッド」を作って待機させるようにしました。これで意図どおり動作しています。
ところが、このライブラリを linux に移植しようと、簡単なコードを書いて調べてみたところ、pthread_join() は親スレッドが子スレッドの終了を待つ場合にしか使えないことがわかりました。上の「そのスレッドが終了するのを待つスレッド」を作る、という方法が使えません。
linux で任意のスレッドの終了を知る方法はないでしょうか?
あるいは、スレッド固有の領域を管理するもっと良い方法はあるでしょうか?
それとも、linux で thread-safety なんか考える必要は無いのでしょうか?
No.1ベストアンサー
- 回答日時:
pthread_join() はスレッドIDさえわかれば親だとか子だとか関係なく使えるはずなのですが、どうやってテストしました?
またpthreadにはクリーンアップハンドラという概念があるのでこれをうまく使えば同様のことが別スレッドなしで実現できます。
この回答への補足
「子は親を待てない」というのは間違いでした。
メインと孫の2つのスレッドが、子スレッドを pthread_join() しようとしたのがエラーの原因だったようです。
あるスレッドを pthread_join() できるスレッドは1個まで、ということなので、「スレッドが終了するのを待つスレッドを作る」というやりかたはダメだということがわかりました。
また、pthread_cleanup_push() 等を使ってクリーンアップハンドラーを登録するやりかたは、自分の書いた関数の中でスレッドが終了する場合は有効ですが、そうでない場合には使えないですね。
で、結局、スレッド固有資源を自動的に解放するのは諦め、ライブラリを呼び出す側のモジュールに、明示的に解放してもらうことにします。
メインスレッドが子スレッドを作り、子が孫を作り、孫が子を pthread_join() で待つようにコードを書いてみました。それで pthread_join() がエラーを返すんですが、何か別の問題があるんでしょうね。
「クリーンアップハンドラ」ですね。調べて見ます。
有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- グループウェア slackについて取り急ぎ教えて頂きたいことがあります 2 2022/04/08 09:05
- ノートパソコン Windows11搭載パソコン 新規購入にあたって 4 2022/11/09 18:11
- CPU・メモリ・マザーボード インテルCPUの世代ごとのデスクトップとノートのコア数についてこれで正しいですか?(*´ω`*) 1 2023/01/07 14:44
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- 世界情勢 ロシアが軍政的・内政的にも揺れている今こそが、北方領土奪還の好機では? 10 2023/05/31 09:31
- Excel(エクセル) エクセル終了が遅くなった 7 2022/04/19 12:11
- 倫理・人権 酔っ払いが他人にたくさん迷惑を掛けているので、もっとお酒規制を厳しくした方が良いのでは? 2 2022/04/11 11:54
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スレッドの監視方法について
-
VC++スレッドの正しい終了のさ...
-
_beginthreadexについて
-
volatile の使い方
-
pthread_cond_wait 取りこぼし?
-
WaitForSingleObjectの使い方に...
-
VisualC++で関数を裏で実行したい
-
VC++ メインループでのイベン...
-
MFC通信プログラムマルチスレッ...
-
KENT "Web Patio" のトピックス...
-
CPU資源をなるべく消費しないで...
-
【C++】boost threadについて
-
並列計算について
-
WindowAPI スレッドのステータ...
-
マルチスレッド?
-
_beginthreadexで生成したスレ...
-
Windows上で、シグナル(SIGTERM...
-
閉じてしまったダイアログのエ...
-
スレッド内でのマルチスレッド...
-
マルチスレッドについて。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
WaitForSingleObjectの使い方に...
-
マイクロソフトedge で5チャン...
-
スレッドの安全な終了のさせ方
-
スレッドの終了はどうやるんで...
-
スレッドにて同一メモリの書き...
-
スレッドの監視方法について
-
マルチスレッドについて
-
スレッドの終了の仕方
-
Linuxでスレッド優先度って変え...
-
Windows上で、シグナル(SIGTERM...
-
LinuxでDoEvents()同等機能
-
VB2005 シリアル通信のClose処理
-
待機関数(WaitForMultipleObjec...
-
マルチスレッドプログラミング...
-
_beginthreadexで生成したスレ...
-
msec単位のWait Timerが作れない!
-
別スレッドからメインダイアロ...
-
マルチスレッドのスレッド数を...
-
.NetのBackgroundWorkerクラス...
おすすめ情報