3

g++ theFile.cc -lboost_thread でコンパイルするこのテスト ケースをここに用意しました。プログラムを実行すると、join コマンドでハングしているようです。理由はよくわかりません。interrupt_point() 関数がメイン スレッドからの参加要求を取得していないようです。

#include <iostream>
#include <stdio.h>
#include <signal.h>
#include <fstream>
#include <boost/thread.hpp>

using namespace std;


//////////////////////////////////

  class SerialnIMU {
  public:
    ~SerialnIMU();

    void start();
    void stop();
  private:
    boost::thread readThread;

    class SerialReader {
    public:

      void operator()();
    private:
    };
  };

////////////////////////////////


SerialnIMU::~SerialnIMU() {
  stop();
}

void SerialnIMU::start() {
  readThread = boost::thread(SerialReader());
  cout<<"Created: "<<readThread.get_id()<<endl;
}

void SerialnIMU::stop() {
  cout<<"Join: "<<readThread.get_id()<<endl;
  cout<<"Joining serial thread..."<<endl;
  readThread.join();
  cout<<"Done."<<endl;
}

//////////////////////serial thread//////////////////

void SerialnIMU::SerialReader::operator()() {
  cout<<"Serial reading thread started..."<<endl;
  try {
    while(true) {
      boost::this_thread::interruption_point();
    }
  } catch(...) {
    cout<<"exception was thrown."<<endl;
  }
  cout<<"Serial reading thread stopped."<<endl;
}


int main(int argc, char **argv) {

  SerialnIMU imu;

  imu.start();
  imu.stop();
  return 0;
}

読んでくれてありがとう。

編集: また、while ループを削除すると、プログラムは正常に終了します... バージョン 1.39.0 をブースト

4

2 に答える 2

2

あなたの stop 関数は実際にはスレッドを中断していないようです。join の呼び出しは中断を意味するものではなく、通常の終了を待つのではなく中断したい場合は、参加する前に .interrupt() を呼び出して明示的に行う必要があります。

于 2009-12-25T04:15:40.703 に答える
1

スレッドは割り込み例外をキャッチし、無期限に処理を続けることができます。中断が最終的なものになるためには、例外がキャッチされないようにするか、キャッチして処理を停止するか、TerminateThread や pthread_cancel など、常にすべてのクリーンアップを実行するとは限らない、もう少し破壊的なものを使用することができます。

スレッドは、boost::this_thread::disable_interruption を使用して割り込みを無効にすることができることに注意してください。

于 2009-12-25T03:46:04.960 に答える