- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:boost::threadでのjoinについて)
boost::threadでのjoinについて
このQ&Aのポイント
- スレッド用に作成したループ用関数を自前で終了させてからjoinをすると、thread::m_joinableがfalseになりjoinでassertが出ることがあります。
- 問題の処理を簡単なモデルで説明しますと、bool g_finish(false); void thread_loop(void) { while(true) { ... if(g_finish) break; } } int main(void) { boost::thread th(thread_loop); sleep(100000); g_finish=true; th.join(); // assert return 0; }
- 冗長ですが、このような処理をするときにjoinのときにm_joinableがfalseになりassertが出るという事態です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
そこで assertがでるということは ・ boost::threadが実行するべき関数(或いは関数オブジェクト)を 受け取っていない(つまりスレッドが実行されていない) ・ 既に join()が呼ばれており、これが2度目の場合 ・ メモリが破壊され、m_joinableが上書きされて falseが入ってしまった のどれかだと思われます。
お礼
確認が遅れ大変失礼いたしました。自己解決いたしました。おそらくPROMETHEUSさんの提示してくださった2つ目が原因のようでした。joinを意図せぬところで呼んでいるコードを残したまま別の終了処理でjoinしていたことが原因のようです。ありがとうございました。