プロが教えるわが家の防犯対策術!

スレッド用に作成したループ用関数を自前で終了させてから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が出るという事態です。

どなたが知識をお持ちの方がおられましたらご教授願えれば幸いです。

A 回答 (1件)

 そこで assertがでるということは


・ boost::threadが実行するべき関数(或いは関数オブジェクト)を
受け取っていない(つまりスレッドが実行されていない)
・ 既に join()が呼ばれており、これが2度目の場合
・ メモリが破壊され、m_joinableが上書きされて falseが入ってしまった

 のどれかだと思われます。
    • good
    • 0
この回答へのお礼

確認が遅れ大変失礼いたしました。自己解決いたしました。おそらくPROMETHEUSさんの提示してくださった2つ目が原因のようでした。joinを意図せぬところで呼んでいるコードを残したまま別の終了処理でjoinしていたことが原因のようです。ありがとうございました。

お礼日時:2008/11/10 02:26

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