Pergunta

Eu tenho esse caso de teste aqui que compila com g ++ thefile.cc -lboost_thread. Ao executar o programa, parece estar pendurado no comando JON. Não sei exatamente o porquê. É como se a função interrupt_point () não estivesse obtendo a solicitação de junção do thread principal.

#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;
}

Obrigado pela leitura.

EDIT: Além disso, se você remover o loop while que o programa sai de maneira limpa ... Boost versão 1.39.0

Foi útil?

Solução

Parece que sua função de parada não interrompe o thread. Chamar a junção não implica interrupção; em vez disso, você precisa fazê -lo explicitamente ligando para .Interrup () antes de ingressar se você deseja interromper, em vez de aguardar o término normal.

Outras dicas

Um thread pode capturar a exceção de interrupção e continuar processando indefinidamente. Para que a interrupção seja final, a exceção deve ser desativada, ou você pode pegar e parar de processar, ou você pode usar algo um pouco mais destrutivo, como Terminatethread ou Pthread_cancel, o que nem sempre pode fazer toda a limpeza.

Observe que é possível que um thread desative as interrupções com o boost :: this_thread :: desabille_interruption.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top