Aumente o tópico e junte -se
-
21-09-2019 - |
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
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.