Вопрос

У меня есть этот тестовый пример, который компилируется с помощью g++ theFile.cc -lboost_thread.При запуске программы кажется, что она зависает на команде соединения.Я не совсем уверен, почему.Это похоже на то, что функция прерывания_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

Это было полезно?

Решение

Похоже, что ваша функция остановки на самом деле не прерывает поток.Вызов соединения не подразумевает прерывания, вместо этого вы должны сделать это явно, вызвав .interrupt() перед присоединением, если вы хотите прервать, а не ждать нормального завершения.

Другие советы

Поток может перехватить исключение прерывания и продолжать обработку бесконечно.Чтобы прерывание было окончательным, исключение должно остаться неперехваченным, или вы можете перехватить и остановить обработку, или вы можете использовать что-то более разрушительное, например TerminateThread или pthread_cancel, которые не всегда могут выполнить всю очистку.

Обратите внимание, что поток может отключить прерывания с помощью boost::this_thread::disable_interruption.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top